【问题标题】:Bulk Inserting Excel Data to Database Using EF Code First使用 EF Code First 将 Excel 数据批量插入数据库
【发布时间】:2015-11-16 09:03:02
【问题描述】:

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

提前致谢。

【问题讨论】:

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


    【解决方案1】:

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


    如果您正在寻找替代方法,以下是一些:

    【讨论】:

    • 这是批量插入的方法吗?我也需要表现。顺便谢谢。
    • LinqToExcel 是一个好方法,但是当我有模型、存储库、实体、服务时,我最好不要使用它。那么还有什么办法呢?
    • @nsarchar 如果您正在寻找一种快速的读取方式,请使用 OLEDB,从 excel 中读取数据,将值映射到您的实体模型并在一个事务中提交所有内容
    • 谢谢大家。但是... 另一个问题呢?除了任何结构 linq2excel 等之外的另一种方式。
    • 我实际上不是在寻找一个组件,只是一个手动阅读。我拥有的 excel 有点复杂,所以我需要逐个单元格地阅读。
    【解决方案2】:

    使用像实体框架这样的 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);
        }
    }
    

    【讨论】:

    • 感谢您的关注。我想我需要准确地读取数据。然后我会照顾这些鸡。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多