`

使用 Bulk Copy 将大量数据复制到数据库

阅读更多

如果一次要向数据库服务器提交多条记录 , 通常会执行多次Insert命令 , 这样就为要插入的每个记录执行一次与数据库服务器的往返 , 这就给服务器增加了压力 , 效率也大大的降低了...
.Net FrameWork 2.0 新增功能 Bulk Copy 可以很快将大量数据加载到数据库中 , 现在利用这一新功能来实现上述功能.
这里从 MS Sql Server 2000 的 NorthWind 的 Orders 表加载数据到 DateTable 模拟要向数据库服务器提交的多条记录集 . 用 Tempdb 库来模拟目标数据库服务器 .
先在 Tempdb 建一个表 temp_orders

USE TEMPDB
CREATE TABLE TEMP_ORDERS
(
    TEMP_ORDERID 
INT,
    TEMP_CUSTOMERID 
NCHAR(5),
    TEMP_ORDERDATE 
DATETIME,
    TEMP_SHIPNAME 
NVARCHAR(40)
)
下面为模拟程序
    protected void Page_Load(object sender, EventArgs e)
    {
        
#region 从NorthWind的Orders表获取要插入的数据
        DataTable dtNorthWindOrders 
= new DataTable();
        
using ( SqlConnection northWindConnection = new SqlConnection( "Data Source=.;Initial Catalog=NorthWind;Integrated Security=True" ) )
        {
            
using ( SqlDataAdapter northWindAdapter = new SqlDataAdapter( "SELECT ORDERID,CUSTOMERID,ORDERDATE,SHIPNAME FROM ORDERS" , northWindConnection ) )
            {
                northWindAdapter.Fill( dtNorthWindOrders );
            }
        }
        
#endregion

        
using ( SqlConnection tempdbConnection = new SqlConnection( "Data Source=.;Initial Catalog=Tempdb;Integrated Security=True" ) )
        {
            tempdbConnection.Open( );

            
using ( SqlTransaction tran = tempdbConnection.BeginTransaction( ) )
            {
                SqlBulkCopy bulkCopyOrders 
= new SqlBulkCopy( tempdbConnection , SqlBulkCopyOptions.Default , tran );
                bulkCopyOrders.DestinationTableName 
= "TEMP_ORDERS";
                
//将数据源表字段和目标表的字段做个映射
                bulkCopyOrders.ColumnMappings.Add( "ORDERID" , "TEMP_ORDERID" );
                bulkCopyOrders.ColumnMappings.Add( 
"CUSTOMERID" , "TEMP_CUSTOMERID" );
                bulkCopyOrders.ColumnMappings.Add( 
"ORDERDATE" , "TEMP_ORDERDATE" );
                bulkCopyOrders.ColumnMappings.Add( 
"SHIPNAME" , "TEMP_SHIPNAME" );

                bulkCopyOrders.BulkCopyTimeout 
= 1000;

                
//每处理10行触发一个事件向页面上输出一个消息
                bulkCopyOrders.SqlRowsCopied += new SqlRowsCopiedEventHandler( onRowsCopy );
                bulkCopyOrders.NotifyAfter 
= 10;

                
try
                {
                    bulkCopyOrders.WriteToServer( dtNorthWindOrders );
                    tran.Commit( );
                }
                
catch ( Exception ex )
                {
                    Response.Write( ex.ToString( ) );
                }
                
finally
                {
                    dtNorthWindOrders 
= null;
                }
            }
        }
    }

    
private void onRowsCopy ( object Sender , SqlRowsCopiedEventArgs args )
    {
        Response.Write(
"已复制:<font color=red>"+ args.RowsCopied.ToString( ) + "</font><br />" );
    }
通过SQL SERVER 事件探察器发现执行的SQL为:
insert bulk TEMP_ORDERS ([TEMP_ORDERID] Int[TEMP_CUSTOMERID] NChar(5) COLLATE Chinese_PRC_CI_AS, [TEMP_ORDERDATE] DateTime[TEMP_SHIPNAME] NVarChar(40) COLLATE Chinese_PRC_CI_AS)
通过运行程序可以看出这个速度是相当的快 , 使用这个方法的最大优点是 : 减少对数据库的访问次数 .
WriteToServer不仅可以处理 DataTable 对象 , 还可以处理 DataReader , DataRow 对象数组 .
分享到:
评论

相关推荐

    bulk insert导入数据

    bulk insert导入数据,可以方便的将大数据量的数据快速导入

    Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据

    然后,我们可以使用 fetch bulk collect into 语句将数据批量取出,并存储在集合类型变量中。 需要注意的是,在使用 fetch bulk collect into 时,我们需要指定 limit xxx 子句,以确定每次取数据块的大小。这可以...

    大容量数据入库bulk

    大阮量数据入库,可以采用bulk insert将文件应设到数据库,加快了入库的时间

    .SqlBulkCopy.Extension第三方批量复制插入sqlServer数据库的dll程序集(支持批量数据合并插入)

    可以方便的将外部数据批量导入、批量合并导入、批量更新导入、批量删除到Sqlserver数据库,基本支持Sqlserver最新的数据库,我用的是Sqlserver2008R2,一点问题没有。共享一下。 需要批量导入数据的同学们,这是福音...

    4秒100万条数据导入SQL数据库-NET(C#)demo

    4秒100万条数据导入SQL数据库-NET(C#)demo 试验的5种方法,比较各种方法的导入速度 基本Insert Into 单线程Bulk Insert 多线程Bulk Insert 单线程SqlBulkCopy 多线程SqlBulkCopy

    批量插入数据到数据库请使用MysqlBulkCopy.dll.zip

    最近跟客户做数据对接比较多,发现平常的添加到数据库数据太慢,所以也没少逛论坛。结合论坛上的资料封装出了一个MysqlBulkCopy。本压缩包内包含SqlBulkCopy.dll和MysqlBulkCopy.dll和其使用源码。源码批量添加到SQL...

    Bulk Insert 批量操作数据库类

    Bulk Insert 批量操作数据库类,使用SqlBulkCopy将DataTable中的数据批量插入数据库中,若源数据集属性与目标表属性字段不一致可额外进行映射

    SQL SERVER BULK INSERT用法

    BULK INSERT 是 SQL Server 中的一种 BulkCopy 功能,允许用户快速将大量数据从文本文件或其他数据源导入到数据库表或视图中。下面是 BULK INSERT 的详细用法和参数解释: 基本语法 BULK INSERT [ [ 'database_...

    数据插入数据库5种方式工具源码2012825

    数据插入数据库5种方式工具源码 功能描述: 基本Insert Into 单线程Bulk Insert 多线程Bulk Insert 单线程SqlBulkCopy 多线程SqlBulkCopy 试验的5种方法,比较各种方法的导入速度 要把导入的文件放在C盘如:c:\\20...

    C# bulk copy 批量插入Sqlserver

    C# bulk copy 批量插入Sqlserver,目前项目正在使用,放心下载

    pg_bulkload-VERSION3_1_16.tar.gz

    适合迁移数据到pg使用 。PostgreSQL提供了一个copy命令的便利数据加载工具,copy命令源于PostgreSQL数据库,copy命令支持文件与表之间的数据加载和表对文件的数据卸载。pg_bulkload是一种用于PostgreSQL的高速数据...

    sql下三种批量插入数据的方法

    第一种方法是使用循环语句逐个将数据项插入到数据库中;第二种方法使用的是SqlBulkCopy,使您可以用其他源的数据有效批量加载 SQL Server 表;第三种使用的方法是sql server中的表值参数方法,表值参数是 SQL Server...

    MR程序Bulkload数据到hbase

    博客配套文件,详细演示了如何通过MR程序的方式bulkload数据到hbase,代码可直接用于生产环境。

    SQL SERVER 创建数据库SQL SERVER 创建数据库SQL SERVER 创建数据库

    - 在缓存中定位数据页,或者将数据页读入缓存,并修改 - 缓存磁盘检查点将已提交的事务写入数据库中 - 数据库恢复的三个阶段:分析、恢复、撤销 4. 设置数据库选项: - 自动选项:AUTO_CREATE_STATISTICS, AUTO...

    pg_bulkload:PostgreSQL批量数据加载器-开源

    pg_bulkload旨在将大量数据加载到数据库中。 您可以绕过PostgreSQL共享缓冲区将数据加载到表中。 pg_bulkload还具有一些ETL功能; 输入数据验证和数据转换。 ---------- pg_bulkload位于pgfoundry中,但是已经暂时...

    把CSV文件导入到SQL Server表中的方法

    有时候我们可能会把CSV中的数据导入到某个数据库的表中,比如做报表分析的时候。 对于这个问题,我想一点也难不倒程序人员吧!但是要是SQL Server能够完成这个任务,岂不是更好! 对,SQL Server确实有这个功能。 ...

    bulk-json-to-mongodb:快速将JSON格式的大量数据添加到您的MongoDB数据库

    快速将JSON格式的大量数据添加到您的MongoDB数据库 如何使用: 首先,将存储库克隆到新目录中: git clone https://github.com/drozdowo/bulk-json-to-mongodb.git然后,导航至该目录并运行: npm install安装依赖...

    ADO.net大数据量操作数据库实验

    基于vs2015\SQL2008的环境,使用常规、bulk、表参等方式进行大批量往SQL server插入数据.

    Z.SqlBulkCopy.Extension第三方批量复制插入sqlServer数据库的方法-chm帮助文档

    可以方便的将外部数据批量导入、批量合并导入、批量更新导入、批量删除到Sqlserver数据库,基本支持Sqlserver最新的数据库,我用的是Sqlserver2008R2,一点问题没有。共享一下。 需要批量导入数据的同学们,这是福音...

Global site tag (gtag.js) - Google Analytics