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);
  • 相关阅读:
    C#使用MVC框架实现登陆验证
    Dynamics CRM 报表开发
    Dynamics CRM 设置公告内容以及追随用户进行公告互动
    Dynamics CRM 访问团队的使用
    Dynamics CRM 键的使用
    Dynamics CRM 安全层次结构及位置
    Dynamics CRM 电子邮件路由器配置
    C# 关于MVC框架的简单实例(计算器)
    -webkit-min-device-pixel-ratio的常见值对照
    兼容IE与firefox的css 线性渐变(linear-gradient)
  • 原文地址:https://www.cnblogs.com/linJie1930906722/p/6045149.html
Copyright © 2011-2022 走看看