چگونه Excel با رکورد زیاد را آپلود کنیم در دیتابیس

شنبه 19 تیر 1400

در بسیاری از موارد نیاز میشه که فایل EXCEL با رکورد زیاد را با سرعت بالا در دیتابیس ذخیره کنیم.در خیلی از موارد از oldb استفاده میشه اما در این مقاله می خواهیم از LinqToExcel و SQLBulkCopy استفاده کنیم و تا چند صد هزار رکورد را کمتر از یک دقیقه (البته اگر فیلترهای زیادنباشد) در دیتابیس ذخیره کرد.

چگونه Excel با رکورد زیاد را آپلود کنیم در دیتابیس

در ابتدا باید افزونه LInqToExcel را در ناگت نصب کنیم:Install-Package LinqToExcel

در مرحله بعد باید فایل مورد نظر را حتما آپلود کنیم.

 string path = Server.MapPath("~/Uploads/");

                   if (!Directory.Exists(path))

                   {

                       Directory.CreateDirectory(path);

                   }

                   var filename = Path.GetFileName(postedFile.FileName);

                   filePath = path + Path.GetFileName(postedFile.FileName);

                   string extension = Path.GetExtension(postedFile.FileName);

                   postedFile.SaveAs(filePath);

در اینجا از linqToExcel استفاده کزده و همه ی اطلاعات فایل را در لیستی می ریزیم توسط شئ ExcelQueryFactory .

 var excel = new ExcelQueryFactory(filePath);

                   string sheetName = "Sheet1";

 var personslist = (from a in excel.Worksheet<Model>(sheetName) select a).ToList();

در مرحله بعد لیست را به DataTable تبدیل می کنیم با متد زیر

public static DataTable ToDataTable<T>(List<T> items)

       {

           DataTable dataTable = new DataTable(typeof(T).Name);

           PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

           foreach (PropertyInfo prop in Props)

           { 

               var type = (prop.PropertyType.IsGenericType &amp;amp;&amp;amp; prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) ? Nullable.GetUnderlyingType(prop.PropertyType) : prop.PropertyType);

               dataTable.Columns.Add(prop.Name, type);

           }

           foreach (T item in items)

           {

               var values = new object[Props.Length];

               for (int i = 0; i < Props.Length; i++)

               {

                   values[i] = Props[i].GetValue(item, null);

               }

               dataTable.Rows.Add(values);

           }

           return dataTable;

       }

ریختن لیست در دیتاتیبل:

 DataTable dt = new DataTable();

                   dt = ToDataTable(personslist);

در مرحله بعد با تعریف کانکشن استرینگ و SQlcopyBulk اطلاعات را در دیتابیس ذخیره می کنیم

     string conString = ConfigurationManager.ConnectionStrings["Mycontext"].ConnectionString;



                   using (SqlConnection con = new SqlConnection(conString))

                   {

                       using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con))

                       {

                           //Set the database table name.

                           sqlBulkCopy.DestinationTableName = "dbo.TestExcels";



                           //[OPTIONAL]: Map the Excel columns with that of the database table

                          // sqlBulkCopy.ColumnMappings.Add("GoodsSmallName", "");

                           sqlBulkCopy.ColumnMappings.Add("DisplayCode", "DisplayCode");

                           sqlBulkCopy.ColumnMappings.Add("Yearlidtime", "Yearlidtime");

                           sqlBulkCopy.ColumnMappings.Add("ValueLidtime", "valueLidtime");

                           sqlBulkCopy.ColumnMappings.Add("Active", "Active");

                           con.Open();

                           sqlBulkCopy.WriteToServer(dt);

                           con.Close();

                       }

                   }

               }


محمدرضا قربانپور

نویسنده 1 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید

نظرات کاربران

برای درج نظر باید وارد سایت شوید