zoukankan      html  css  js  c++  java
  • sql sever 批量插入

    /// <summary>
    /// 提供数据批量处理的方法。
    /// </summary>
    public interface IBatcherProvider : IProviderService
    {
    /// <summary>
    /// 将 <see cref="DataTable"/> 的数据批量插入到数据库中。
    /// </summary>
    /// <param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param>
    /// <param name="batchSize">每批次写入的数据量。</param>
    void Insert(DataTable dataTable, int batchSize = 10000);
    }

    /// <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();
    }
    }
    }
    }

    SqlBulkCopy的ColumnMappings中列的名称受大小写敏感限制,因此在构造DataTable的时候应请注意列名要与表一致。

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

    得之坦然,失之淡然,争其必然,顺其自然
  • 相关阅读:
    谁主沉浮
    东野圭吾--嫌疑人X的献身读后感
    (三)Spring 依赖注入
    (二) Spring项目的搭建
    (一) Spring基础概述
    spring boot 运行jsp原理分析
    Java-01背包问题-动态规划-递归和非递归实现
    博客移至CSDN
    Navicat Premium 连接Oracle登入时候报ORA-12638: 身份证明检索失败的解决办法
    oracle 可以连接数据库,vs连不上. 报错提示:ORA-12154: TNS: 无法解析指定的连接标识符
  • 原文地址:https://www.cnblogs.com/leegj/p/9600366.html
Copyright © 2011-2022 走看看