zoukankan      html  css  js  c++  java
  • 使用SqlServer数据批量插入

    一、SqlServer数据批量插入

    SqlServer的批量插入很简单,使用SqlBulkCopy就可以,以下是该类的实现:

    /// <summary>
        /// 为 System.Data.SqlClient 提供的用于批量操作的方法。
        /// </summary>
        public sealed class MsSqlBatcher : IBatcherProvider
        {
            /// <summary>
            /// 获取或设置提供者服务的上下文。
            /// </summary>
            public ServiceContext ServiceContext { get; set; }
    
            /// <summary>
            ///<see cref="DataTable"/> 的数据批量插入到数据库中。
            /// </summary>
            /// <param name="dataTable">要批量插入的 <see cref="DataTable"/></param>
            /// <param name="batchSize">每批次写入的数据量。</param>
            public void Insert(DataTable dataTable, int batchSize = 10000)
            {
                Checker.ArgumentNull(dataTable, "dataTable");
                if (dataTable.Rows.Count == 0)
                {
                    return;
                }
                using (var connection = (SqlConnection)ServiceContext.Database.CreateConnection())
                {
                    try
                    {
                        connection.TryOpen();
                        //给表名加上前后导符
                        var tableName = DbUtility.FormatByQuote(ServiceContext.Database.Provider.GetService<ISyntaxProvider>(), dataTable.TableName);
                        using (var bulk = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, null)
                            {
                                DestinationTableName = tableName, 
                                BatchSize = batchSize
                            })
                        {
                            //循环所有列,为bulk添加映射
                            dataTable.EachColumn(c => bulk.ColumnMappings.Add(c.ColumnName, c.ColumnName), c => !c.AutoIncrement);
                            bulk.WriteToServer(dataTable);
                            bulk.Close();
                        }
                    }
                    catch (Exception exp)
                    {
                        throw new BatcherException(exp);
                    }
                    finally
                    {
                        connection.TryClose();
                    }
                }
            }
        }

     以上没有使用事务,使用事务在性能上会有一定的影响,如果要使用事务,可以设置SqlBulkCopyOptions.UseInternalTransaction。

  • 相关阅读:
    【模板】二分
    电脑桌面美化
    浪在ACM新春大作战
    【递归入门】组合+判断素数:dfs(递归)
    【递归入门】组合的输出:dfs
    01背包问题:DP
    [蓝桥杯][历届试题]回文数字
    洛谷 P1706 全排列问题 :STL / dfs
    【模板】DFS
    洛谷 P1781 宇宙总统:sort(string)
  • 原文地址:https://www.cnblogs.com/qwji/p/3397051.html
Copyright © 2011-2022 走看看