zoukankan      html  css  js  c++  java
  • .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);
  • 相关阅读:
    javaEE企业级基础介绍(一)
    SQL学习笔记系列(十)窗口函数
    SQL学习笔记系列(九)索引优化分析
    Tableau教程笔记
    淘宝用户行为分析--基于MySQL、Tableau
    Stop thinking,start living--《心灵奇旅》观后感
    SQL刷题
    SQL学习笔记系列(八)流程控制结构
    SQL学习笔记系列(七)存储过程和函数
    在超算系统上使用sbatch提交MXNet分布式训练任务
  • 原文地址:https://www.cnblogs.com/linJie1930906722/p/6045149.html
Copyright © 2011-2022 走看看