使用EF Code First将Excel数据批量插入数据库

时间:2015-11-16 09:03:03

标签: asp.net-mvc excel entity-framework ef-code-first bulkinsert

我首先使用asp.net mvc ef代码。我将文件上传到服务器所有我需要的是将excel数据插入到第一个数据库的代码中。将Excel数据批量插入数据库的最佳方法是什么?非常感谢您的咨询。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您可以使用LinqToExcel从Excel文件中获取数据并将其映射到您的实体类中。

如果您正在寻找替代方法,可以使用以下方法:

答案 1 :(得分:1)

使用类似于Entity Framework的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);
    }
}