آموزشبرنامه نویسی

آموزش آپلود Excel با رکورد زیاد در دیتابیس

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

در ابتدا باید افزونه 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();

                       }

                   }

               }


دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

نوشته های مشابه

دکمه بازگشت به بالا