ذخیره اطلاعات Excell در دیتابیس SQL + فایل پروژه
در این پست قصد داریم تا به کمک به اپلیکیشن ویندوزی با سی شارپ اطلاعات یک فایل اکسل را در دیتابیس قرار دهیم :
برای این نرم افزار نیاز داریم تا یک پروژه ویندزوی سی شارپ به صورت زیر ایجاد کنیم :
برای باتن ایجاد شده کد های زیر را می نویسیم :
private void Button1_Click(object sender, EventArgs e) { OpenFileDialog ope = new OpenFileDialog { Filter = "Excel Files|*.xls;*.xlsx;*.xlsm" }; if (ope.ShowDialog()==DialogResult.Cancel) { return; } FileStream stream = new FileStream(ope.FileName,FileMode.Open); IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); DataSet result = excelReader.AsDataSet(); DataTable firstTable = result.Tables[0]; firstTable.Rows[0].Delete(); System.IO.StringWriter writer = new System.IO.StringWriter(); firstTable.WriteXml(writer, XmlWriteMode.WriteSchema, false); string res = writer.ToString(); DataTable checkData = new DataTable(); checkData = CheckXml(res); if (checkData.Rows.Count>0) { lblDuplication.Text = "داده تکراری وجود دارد، امکان ذخیره دیتابیس وجود ندارد"; } else { try { using (SqlConnection con = new SqlConnection(@"[Your SQL Connection String]")) { using (SqlCommand cmd = new SqlCommand("InsertXML")) { cmd.Connection = con; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@xml", res); con.Open(); cmd.ExecuteNonQuery(); con.Close(); } } lblDuplication.Text = "اطلاعات با موفقیت ذخیره شدند"; } catch (Exception) { lblDuplication.Text = "یک خطا در نرم افزار روی داده است"; } } }
همچنین در کدهای بالا از تابعی به نام CheckXml استفاده کردیم کردیم که کد اون به این صورت خواهد بود :
private DataTable CheckXml(string xml) { DataSet ds = new DataSet(); DataTable dt = new DataTable(); using (SqlConnection con = new SqlConnection(@"Your SQL Connection String")) { using (SqlCommand cmd = new SqlCommand("CheckXML")) { cmd.Connection = con; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@xml", xml); con.Open(); SqlDataAdapter sda = new SqlDataAdapter { SelectCommand = cmd }; sda.Fill(dt); con.Close(); return dt; } } }
بعد از اجرای کد های بالا نیاز داریم تا پروسیجر افزودن داده های Xml را به دیتابیس ایجاد کنیم
که ابتدا من قصد دارم داده های تکراری رو بررسی کنم
کد Sql پایین رو اجرا کنید :
USE [HypersourceTestDB] go SET ansi_nulls ON go SET quoted_identifier ON go create PROCEDURE [dbo].[Checkxml] @xml XML AS BEGIN SET nocount ON; CREATE TABLE #temp11 ( test_id NCHAR(10), test_name VARCHAR(50), test_surname VARCHAR(50), test_age INT ) INSERT INTO #temp11 SELECT customer.value('(Column1/text())[1]', 'nchar(10)') AS test_id, customer.value('(Column2/text())[1]', 'varchar(50)') AS test_name, customer.value('(Column3/text())[1]', 'varchar(50)') AS test_surname, customer.value('(Column4/text())[1]', 'int') AS test_age FROM @xml.nodes('/NewDataSet/Sheet1')AS TEMPTABLE(customer) SELECT * INTO #temp1 FROM (SELECT * FROM #temp11 UNION ALL SELECT * FROM test1) AS temp SELECT * INTO #temp2 FROM (SELECT Row_number() OVER( partition BY test_id, test_name, test_surname, test_age ORDER BY test_id) AS rownum, * FROM #temp1) AS temp SELECT * FROM #temp2 WHERE rownum > 1 END -- -- select * from test1
بعد این کد ها الان باید دستور افزودن دیتا ها داحل دیتابیس رو بنویسیم :
SET ansi_nulls ON go SET quoted_identifier ON go ALTER PROCEDURE [dbo].[Insertxml] @xml XML AS BEGIN SET nocount ON; INSERT INTO test1 SELECT customer.value('(Column1/text())[1]', 'nchar(10)') AS test_id, customer.value('(Column2/text())[1]', 'varchar(50)') AS test_name, customer.value('(Column3/text())[1]', 'varchar(50)') AS test_surname, customer.value('(Column4/text())[1]', 'int') AS test_age FROM @xml.nodes('/NewDataSet/Sheet1')AS TEMPTABLE(customer) END
همچنین کل فایل ها و پروژه ها ضمیمه این آموزش هستند و میتوانید از اینجا پروژه را دانلود کنید
حجم فایل : 3MB
رمز فایل : www.hypersource.ir