使用 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 = ;
//每处理10行触发一个事件向页面上输出一个消息
bulkCopyOrders.SqlRowsCopied += new SqlRowsCopiedEventHandler( onRowsCopy );
bulkCopyOrders.NotifyAfter = ;
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("已复制:"+ args.RowsCopied.ToString( ) + "
" );
}
通过SQL SERVER 事件探察器发现执行的SQL为:
insert bulk TEMP_ORDERS ([TEMP_ORDERID] Int, [TEMP_CUSTOMERID] NChar() COLLATE Chinese_PRC_CI_AS, [TEMP_ORDERDATE] DateTime, [TEMP_SHIPNAME] NVarChar() COLLATE Chinese_PRC_CI_AS)
通过运行程序可以看出这个速度是相当的快 , 使用这个方法的最大优点是 : 减少对数据库的访问次数 .
WriteToServer不仅可以处理 DataTable 对象 , 还可以处理 DataReader , DataRow 对象数组 .
使用 Bulk Copy 将大量数据复制到数据库的更多相关文章
- Oracle数据库间的数据复制 - SQLPlus中的COPY命令
Copy命令可以实现不同Oracle数据库间的数据的复制,也是可以实现同一数据库的数据复制,其性能表现和导入/导出相同. 根据9i文档,说Copy命令未来会不支持,但实际上Oracle 11g仍然支持 ...
- 云区域(region),可用区(AZ),跨区域数据复制(Cross-region replication)与灾备(Disaster Recovery)(部分1)
本文分两部分:部分1 和 部分2.部分1 介绍 AWS,部分2 介绍阿里云和OpenStack云. 1. AWS 1.1 AWS 地理组件概况 AWS 提供三种地理性组件: Regions:区域,即A ...
- 基于Tablestore Tunnel的数据复制实战
前言 数据复制主要指通过互联的网络在多台机器上保存相同数据的副本,通过数据复制方案,人们通常希望达到以下目的:1)使数据在地理位置上更接近用户,进而降低访问延迟:2)当部分组件出现故障时,系统依旧可以 ...
- ODAC (V9.5.15) 学习笔记(二十一)数据复制
用TVirtualTable在内存中缓存TOraQuery中的数据,主要应用场景是参照其他数据,需要将TOraQuery中的数据复制到TVirtualTable,由于没有类似于TClientDataS ...
- SQL把表中的数据复制到另一个数据库中
1 删除整张表的数据,并还原自增长值TRUNCATE TABLE TbWeixinActivity 2 3张表左连接select a.ID,c.Name,b.nickname,a.CreateDate ...
- docker 数据共享,数据复制
docker 提供的数据共享的方式有 docker run -it -v:/dataname image 数据复制使用 docker cp containerid:/dataname ...
- SqlServer将表中数据复制到另一张表
insert into phone2(ph,attr,type,carrier) select top 1000 ph,attr,type,carrier from phone 将表phone的字段和 ...
- 将表A的数据复制到表B,以及关于主表和子表的删除办法
如果表A的数据结构和表B的数据结构是一样的,字段名字可以不用相同,但是对应的数据类型是一样的 这样的情况下可以用如下的方式实现将表A的数据复制到表B INSERT INTO #TEMP2 SELECT ...
- sql server 2008数据复制
SQL Server 2008数据库复制是通过发布/订阅的机制进行多台服务器之间的数据同步,我们把它用于数据库的同步备份.这里的同步备份指的是备份服务器与主服务器进行实时数据同步,正常情况下只使用主数 ...
随机推荐
- attempt to write a readonly database错误的解决(C#,SQLite)
今天打包WPF程序,安装后总是打不开,查看监控日志原来是SQLite的问题,报错如图 当向SQLite数据库中存入新纪录时总是显示attempt to write a readonly a datab ...
- asp.net web api 跨域,带cookie
官网上有一个介绍 http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api 但是只支 ...
- Ajax 学习(一)
此篇为学习笔记 概述 Ajax(Asynchronous Javascrpt And Xml)是一种运用于浏览器的技术,它可以在浏览器与服务器之间使用异步通信机制进行数据通信,从而允许浏览器向服务器获 ...
- 7行代码看EntityFramework是如何运行
这段时间在项目中运用Entity Framework作为底层数据交互框架.一个字,爽.不仅提高了开发效率,省了很多代码,而且数据库也规范了很多.按照网上的一些教程初步学习,然后实际运用了,再结合MVC ...
- SpringBoot+JPA+cache入门
在pom.xml中加入如下依赖 <dependency> <groupId>org.springframework.boot</groupId> <artif ...
- Java的简单书写格式
在一个java源代码中只能出现一个public类,而且必须跟文件名相同 在源代码的全局域类中只有 public 和 default 两种可见度 全局域不能写代码,只能定义类 成员类的构造方法和类的可见 ...
- POJ Georgia and Bob-----阶梯博弈变形。
Georgia and Bob Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6622 Accepted: 1932 D ...
- before(),after(),prepend(),append()等新DOM方法简介
一.DOM API也在不断升级 web前端标准一直在不断升级,比方说,说了很多年的HTML5.CSS3,以及天天见的ES6. 然后,似乎就没有然后了.实际上,除了HTML5/CSS3/ES6+,关于D ...
- Zookeeper学习文章目录1
目录:参考文章如下 1.ZooKeeper学习第一期---Zookeeper简单介绍 2. ZooKeeper学习第二期--ZooKeeper安装配置 3. ZooKeeper学习第三期---Zook ...
- DDD Quickly - 读书笔记
读后感:关于领域驱动设计,过去多多少少用到一些.所以,这本精简版看起来很快,很多概念很熟悉,它帮助我把散乱的知识串起来.最后,Eric Evans谈到一点,本来软件的发展是向着处理复杂的业务逻辑走的, ...