.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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值