چگونه Excel با رکورد زیاد را آپلود کنیم در دیتابیس
شنبه 19 تیر 1400در بسیاری از موارد نیاز میشه که فایل 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; 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();
}
}
}
- ASP.net MVC
- 2k بازدید
- 2 تشکر
برای درج نظر باید وارد سایت شوید