• .Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库


    批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储。

    采用SqlBulkCopy来处理存储数据。SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储到数据库中,而不需要一次一次的向数据库Insert数据。

    经过几次实验,百万级别的数据表,也只需几秒时间内就可以完全的存入数据库中,其速度,比传统的Insert into方法不止快很多倍。

    下面看代码:

            /// <summary>
            /// 批量插入数据
            /// </summary>
            /// <param name="connectionString">连接数据库字符串</param>
            /// <param name="tableName">表名称</param>
            /// <param name="dt">需要批量插入数据库DataTable数据源</param>
            /// <param name="bulkCopyTimeout">连接数据库的溢出时间</param>
            /// <returns></returns>
            public static bool SqlBulkCopyByDatatable(string connectionString, string tableName, DataTable dt, int bulkCopyTimeout = 120)
            {
                try
                {
                    using (SqlBulkCopy sqlbulkCopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction))
                    {
                        sqlbulkCopy.DestinationTableName = tableName;
                        sqlbulkCopy.BulkCopyTimeout = bulkCopyTimeout;
                        for (int i = 0; i < dt.Columns.Count; i++)
                        {
                            sqlbulkCopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
                        }
                        sqlbulkCopy.WriteToServer(dt);
                        sqlbulkCopy.Close();//关闭连接  
                        return true;
                    }
                }
                catch (System.Exception ex)
                {
                    throw ex;
                }
    
            }
    
            /// <summary>
            /// 批量插入数据
            /// </summary>
            /// <param name="connectionString">连接数据库字符串</param>
            /// <param name="tableName">表名称</param>
            /// <param name="dt">需要批量插入数据库DataTable数据源</param>
            /// <param name="batchSize">一次批量插入多少条数据</param>
            /// <param name="bulkCopyTimeout">连接数据库的溢出时间</param>
            /// <returns></returns>
            public static bool SqlBulkCopyByDatatable(string connectionString, string tableName, DataTable dt, int batchSize,int bulkCopyTimeout=120)
            {
                try
                {
                    using (SqlBulkCopy sqlbulkCopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction))
                    {
                        sqlbulkCopy.BatchSize = batchSize;
                        sqlbulkCopy.DestinationTableName = tableName;
                        sqlbulkCopy.BulkCopyTimeout = bulkCopyTimeout;
                        for (int i = 0; i < dt.Columns.Count; i++)
                        {
                            sqlbulkCopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
                        }
                        sqlbulkCopy.WriteToServer(dt);
                        sqlbulkCopy.Close();//关闭连接
                        return true;
                    }
                }
                catch (System.Exception ex)
                {
                    throw ex;
                }
    
            }

     使用例子:

    1、创建一个数据库、和一个数据表

    create database TestBatchOperateMssqlserverDB;    
    go    
    use TestBatchOperateMssqlserverDB;    
    go 
    CREATE TABLE Product(
    ProductId BIGINT identity(1,1) PRIMARY KEY,
    ProductName VARCHAR(50) NOT NULL,
    Price MONEY NOT NULL
    )

    2、建立和数据表结构相同的Datatable

                System.Data.DataTable dt = new System.Data.DataTable();  //表的结构要和数据库一样
                dt.Columns.AddRange(new System.Data.DataColumn[]
                {   
                    new System.Data.DataColumn("ProductId",typeof(long)),  //自增
                    new System.Data.DataColumn("ProductName",typeof(string)),  
                    new System.Data.DataColumn("Price",typeof(decimal))
                });

    3、为dataTable装配数据

                for (int i = 0; i < 100000; i++)
                {
                    System.Data.DataRow dr = dt.NewRow();
                    //dr[0] = i;  //自增
                    dr[1] = string.Format("商品{0}", i);
                    dr[2] = (decimal)i;
                    dt.Rows.Add(dr);
                }

    4、将数据插入到数据库

     SqlBulkCopyByDatatable("server=.;database=TestBatchOperateMssqlserverDB;uid=sa;pwd=123456" , "Product", dt);
  • 相关阅读:
    多线程协作wait、notify、notifyAll方法简介理解使用 多线程中篇(十四)
    深入解析ThreadLocal 详解、实现原理、使用场景方法以及内存泄漏防范 多线程中篇(十七)
    java线程通信与协作小结 多线程中篇(十六)
    sleep、yield、join方法简介与用法 sleep与wait区别 多线程中篇(十五)
    final 关键字与安全发布 多线程中篇(十三)
    java 轻量级同步volatile关键字简介与可见性有序性与synchronized区别 多线程中篇(十二)
    windows系统dokuwiki安装部署设置 xampp环境配置
    synchronized关键字简介 多线程中篇(十一)
    Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)
    java锁与监视器概念 为什么wait、notify、notifyAll定义在Object中 多线程中篇(九)
  • 原文地址:https://www.cnblogs.com/linJie1930906722/p/6045149.html
Copyright © 2020-2023  润新知