【发布时间】:2015-11-16 09:03:02
【问题描述】:
我首先使用asp.net mvc ef 代码。我将文件上传到服务器,我只需要将该 excel 数据插入到代码第一个数据库中。将excel数据批量插入数据库的最佳方法是什么?非常感谢您的咨询。
提前致谢。
【问题讨论】:
标签: asp.net-mvc excel entity-framework ef-code-first bulkinsert
我首先使用asp.net mvc ef 代码。我将文件上传到服务器,我只需要将该 excel 数据插入到代码第一个数据库中。将excel数据批量插入数据库的最佳方法是什么?非常感谢您的咨询。
提前致谢。
【问题讨论】:
标签: asp.net-mvc excel entity-framework ef-code-first bulkinsert
您可以使用LinqToExcel 从 Excel 文件中获取数据并将其映射到您的实体类中。
如果您正在寻找替代方法,以下是一些:
【讨论】:
使用像实体框架这样的 ORM 来执行批量操作效率不高。要有效地批量插入,必须使用 SqlBulkCopy 类。 要插入通用列表,必须将其转换为 DataTable:
要插入通用列表,必须将其转换为 DataTable:
public static DataTable ConvertToDataTable<T>(IList<T> list)
{
PropertyDescriptorCollection propertyDescriptorCollection = TypeDescriptor.GetProperties(typeof(T));
DataTable table = new DataTable();
for (int i = 0; i < propertyDescriptorCollection.Count; i++)
{
PropertyDescriptor propertyDescriptor = propertyDescriptorCollection[i];
Type propType = propertyDescriptor.PropertyType;
if (propType.IsGenericType && propType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
table.Columns.Add(propertyDescriptor.Name, Nullable.GetUnderlyingType(propType));
}
else
{
table.Columns.Add(propertyDescriptor.Name, propType);
}
}
object[] values = new object[propertyDescriptorCollection.Count];
foreach (T listItem in list)
{
for (int i = 0; i < values.Length; i++)
{
values[i] = propertyDescriptorCollection[i].GetValue(listItem);
}
table.Rows.Add(values);
}
return table;
}
然后就可以使用SqlBulkCopy了。在示例中,用户表是批量插入的:
DataTable dt = new DataTable();
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connection))
{
sqlBulkCopy.ColumnMappings.Add("UserID", "UserID");
sqlBulkCopy.ColumnMappings.Add("UserName", "UserName");
sqlBulkCopy.ColumnMappings.Add("Password", "Password");
sqlBulkCopy.DestinationTableName = "User";
sqlBulkCopy.WriteToServer(dt);
}
}
【讨论】: