使用 Bulk Copy 将大量数据复制到数据库
来源:互联网 发布:淘宝购物流程步骤 编辑:程序博客网 时间:2024/05/22 16:26
如果一次要向数据库服务器提交多条记录 , 通常会执行多次Insert命令 , 这样就为要插入的每个记录执行一次与数据库服务器的往返 , 这就给服务器增加了压力 , 效率也大大的降低了...
.Net FrameWork 2.0 新增功能 Bulk Copy 可以很快将大量数据加载到数据库中 , 现在利用这一新功能来实现上述功能.
这里从 MS Sql Server 2000 的 NorthWind 的 Orders 表加载数据到 DateTable 模拟要向数据库服务器提交的多条记录集 . 用 Tempdb 库来模拟目标数据库服务器 .
先在 Tempdb 建一个表 temp_orders
下面为模拟程序
通过运行程序可以看出这个速度是相当的快 , 使用这个方法的最大优点是 : 减少对数据库的访问次数 .
WriteToServer不仅可以处理 DataTable 对象 , 还可以处理 DataReader , DataRow 对象数组 .
.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)
)
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)
...{
从NorthWind的Orders表获取要插入的数据#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 />");
}
...{
从NorthWind的Orders表获取要插入的数据#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 Copy 将大量数据复制到数据库
- 使用 Bulk Copy 将大量数据复制到数据库
- 使用 Bulk Copy 将大量数据复制到数据库
- 使用 Bulk Copy 将大量数据复制到数据库..............学习笔记
- 巧用Bulk Copy将大量的数据复制到数据库(对同一个数据的表或不同一个数据库的表都行)
- c-tree数据库大量数据bulk loading
- 使用LINQ to SQL将数据从一个数据库复制到另一个数据库
- Bulk Insert:将文本数据(csv和txt)导入到数据库中
- 如何使用SQLyog将大量数据导入mysql数据库
- 使用Hibernate映射技术将Mysql数据复制到Oracle数据库
- BULK INSERT如何将大量数据高效地导入SQL Server
- mysql5.7.9安装步骤及如何将原来数据库中的数据复制到新的数据库中使用
- c# 快速 将大量数据插入数据库
- 将数据库复制到scard
- sql server Bulk 批量导入大量数据
- mongodb list 大量插入数据 Bulk()
- 使用Bulk Insert语句将文本文件读入数据库
- 如何使用python将大量数据导出到Excel中的小技巧
- Eclipse3.2.1+jboss4.0.5开发J2EE中的EJB (有状态会话Bean 附图)一
- Java中的语句、分支和路径覆盖测试
- NetBeans的Gmail插件!
- CXX0017:Error:symbol "xxx" not found 问题解决方法
- Eclipse3.2.1+jboss4.0.5开发J2EE中的EJB (有状态会话Bean 附图)二
- 使用 Bulk Copy 将大量数据复制到数据库
- Asp.net 2.0状态管理小结
- #pragma用法大全
- Ajax+PHP简单入门教程
- [转载]ORACLE EXP/IMP 参数详解
- [转]COM套间
- MTK6226_05C手机通话管理MMI层小结(1)
- The beginning of My blog
- 2008年5月21日,C中getchar()函数。