ADO.NET批量添加数据到SQL Server—BulkCopy使用指南

  BulkCopy位于System.Data.SqlClient命名空间,允许你使用其他源的数据有效地批量加载 SQL Server 表。

  属性:

BatchSize :每个批处理中的行数。 在每个批处理结束时,批处理中的行将发送到服务器。

BulkCopyTimeout:超时之前可用于完成操作的秒数。

ColumnMappings:返回 SqlBulkCopyColumnMapping 项的集合。 列映射定义数据源中的列和目标中的列之间的关系。

DestinationTableName:服务器上的目标表的名称。

EnableStreaming:启用或禁用 SqlBulkCopy 对象,以流式传输 IDataReader 对象中的数据。

NotifyAfter:定义生成通知事件之前要处理的行数。

  今天测试了一下BulkCopy的速度,100W的数据量存储在List<T>中,把List转化成Datatable后使用BulkCopy批量添加,总平均时间仅为7.5秒。以下是使用方式。

  1.首先是数据库操作方法

        /// <summary>
        /// 批量添加
        /// </summary>
        /// <param name="sqlBulkCopyColumnMappings">缓存数据表DataTable的列与SQL Server数据表列的映射关系</param>
        /// <param name="dataTable">缓存数据表DataTable</param>
        public static void SqlBulkCopy(List<SqlBulkCopyColumnMapping> sqlBulkCopyColumnMappings, DataTable dataTable)
        {
            using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(datalink.ConnectionString))
            {
                sqlBulkCopy.DestinationTableName = "Student";
                sqlBulkCopy.BatchSize = 10;
                foreach (var item in sqlBulkCopyColumnMappings)
                {
                    sqlBulkCopy.ColumnMappings.Add(item.SourceColumn, item.DestinationColumn);
                }

                sqlBulkCopy.WriteToServer(dataTable);
            }
        }

  说明:如果模型类Model与数据表字段一一对应,第一个参数sqlBulkCopyColumnMappings使用空构造方法创建一个即可。由于这是Student表的数据库操作类,所以DestinationTableName直接赋值Student。

  2.可能需要以下辅助类,把List数据转化成DataTable

        /// <summary>
        /// List集合转换成DataTable
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        public static DataTable ListToDataTable(IList list)
        {
            DataTable result = new DataTable();
            if (list.Count > 0)
            {
                PropertyInfo[] propertys = list[0].GetType().GetProperties();
                foreach (PropertyInfo pi in propertys)
                {
                    //获取类型
                    Type colType = pi.PropertyType;
                    //当类型为Nullable<>时
                    if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
                    {
                        colType = colType.GetGenericArguments()[0];
                    }
                    result.Columns.Add(pi.Name, colType);
                }
                for (int i = 0; i < list.Count; i++)
                {
                    ArrayList tempList = new ArrayList();
                    foreach (PropertyInfo pi in propertys)
                    {
                        object obj = pi.GetValue(list[i], null);
                        tempList.Add(obj);
                    }
                    object[] array = tempList.ToArray();
                    result.LoadDataRow(array, true);
                }
            }
            return result;
        }
View Code

 

转载于:https://www.cnblogs.com/yuyuefly/p/9700150.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要安装 Microsoft.Office.Interop.Excel 和 System.Data.SqlClient 两个 NuGet 包。 然后,你可以使用以下代码将 Excel 数据导入到 SQL Server 数据库中: ```csharp using System.Data; using System.Data.SqlClient; using Microsoft.Office.Interop.Excel; // 导入 Excel 数据到 DataTable public DataTable ImportExcelToDataTable(string filePath) { Application excel = new Application(); Workbook workbook = excel.Workbooks.Open(filePath); Worksheet worksheet = workbook.ActiveSheet; Range range = worksheet.UsedRange; DataTable dataTable = new DataTable(); for (int i = 1; i <= range.Columns.Count; i++) { dataTable.Columns.Add(range.Cells[1, i].Value2.ToString()); } for (int i = 2; i <= range.Rows.Count; i++) { DataRow dataRow = dataTable.NewRow(); for (int j = 1; j <= range.Columns.Count; j++) { dataRow[j - 1] = range.Cells[i, j].Value2.ToString(); } dataTable.Rows.Add(dataRow); } workbook.Close(); excel.Quit(); return dataTable; } // 将 DataTable 存储到 SQL Server 数据库 public void SaveDataTableToSqlServer(DataTable dataTable, string connectionString, string tableName) { using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection)) { bulkCopy.DestinationTableName = tableName; foreach (DataColumn column in dataTable.Columns) { bulkCopy.ColumnMappings.Add(column.ColumnName, column.ColumnName); } bulkCopy.WriteToServer(dataTable); } } } ``` 使用时,你可以这样调用: ```csharp string filePath = "path/to/excel/file.xlsx"; string connectionString = "Data Source=your_server_name;Initial Catalog=your_database_name;Integrated Security=True"; string tableName = "your_table_name"; DataTable dataTable = ImportExcelToDataTable(filePath); SaveDataTableToSqlServer(dataTable, connectionString, tableName); ``` 注意:这种方法适用于 Excel 文件中的数据SQL Server 数据库表的列名称一致的情况。如果不一致,你需要在代码中进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值