All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
教你安装SQL Server 2005示例数据库_[SQL Server教程]
让PHP支持页面回退的两种方法_php资料_编程技术
Varchar与char的区别_[SQL Server教程]
经典php实现大文件上传源代码_[PHP教程]
GridView实用示例源码(可以导出Excel)_[Asp.Net教程]
使用Forms,Authentication实现用户注册、登录,(一)基础知识_[Asp.Net教程]
组合ASP.NET,2.0数据控件构建强大用户接口_[Asp.Net教程]
技巧:PHP+MYSQL动态网页编程纠错指南_[PHP教程]
session简要用法实例_[Asp.Net教程]
Silverlight,2,(beta1)数据操作(5)——使用LINQ,to,SQL进行数据_[Asp.Net教程]
Reading number is top 10 pictures
女人化妆前后的对比
俄罗斯台球天后惊艳魅惑2
Wild animals melee moment of life and death1
A letter to parents choose world of warcraft seven big reason
夕阳下的北京街道
Female model behind the bitterness, often being overcharged3
PengLiYuan lady for the world health organization fight TB and AIDS goodwill ambassador
Sora aoi on twitter1
Sora aoi mirror memorial classics1
A man's favorite things2
Download software ranking
WebService在.NET中的实战应用教学视频 → 第4集
Boxer vs Yellow4
Boxer's Top ten classic battle5
中国结婚习俗实录
WebService在.NET中的实战应用教学视频 → 第1集
双旗镇刀客A
linux初级教程
Boxer's Top ten classic battle7
Tram sex maniac 2 (H) rar bag19
星际争霸1.08硬盘免安装版
delv published in(发表于) 2014/1/6 8:46:44 Edit(编辑)
.net2.0中使用SqlBulkCopy进行大批量数据迁移_[Asp.Net教程]

.net2.0中使用SqlBulkCopy进行大批量数据迁移_[Asp.Net教程]

.net2.0中使用SqlBulkCopy进行大批量数据迁移_[Asp.Net教程]

在.Net1.1中无论是对于批量插入整个DataTable中的所有数据到数据库中,还是进行不同数据源之间的迁移,都不是很方便。而在.Net2.0中,SQLClient命名空间下增加了几个新类帮助我们通过DataTable或DataReader批量迁移数据。数据源可以来自关系数据库或者XML文件,甚至WebService返回结果。其中最重要的一个类就是SqlBulkCopy类,使用它可以很方便的帮助我们把数据源的数据迁移到目标数据库中。
下面我们先通过一个简单的例子说明这个类的使用:


DateTime startTime;
protected void Button1_Click(object sender, EventArgs e)
{
startTime = DateTime.Now;
string SrcConString;
string DesConString;
SqlConnection SrcCon = new SqlConnection();
SqlConnection DesCon = new SqlConnection();
SqlCommand SrcCom = new SqlCommand();
SqlDataAdapter SrcAdapter = new SqlDataAdapter();
DataTable dt = new DataTable();
SrcConString =
ConfigurationManager.ConnectionStrings["SrcDBConnectionString"].ConnectionString;
DesConString =
ConfigurationManager.ConnectionStrings["DesDBConnectionString"].ConnectionString;
SrcCon.ConnectionString = SrcConString;
SrcCom.Connection = SrcCon;
SrcCom.CommandText = " SELECT * From [SrcTable]";
SrcCom.CommandType = CommandType.Text;
SrcCom.Connection.Open();
SrcAdapter.SelectCommand = SrcCom;
SrcAdapter.Fill(dt);
SqlBulkCopy DesBulkOp;
DesBulkOp = new SqlBulkCopy(DesConString,
SqlBulkCopyOptions.UseInternalTransaction);
DesBulkOp.BulkCopyTimeout = 500000000;
DesBulkOp.SqlRowsCopied +=
new SqlRowsCopiedEventHandler(OnRowsCopied);
DesBulkOp.NotifyAfter = dt.Rows.Count;
try
{
DesBulkOp.DestinationTableName = "SrcTable";
DesBulkOp.WriteToServer(dt);
}
catch (Exception ex)
{
lblResult.Text = ex.Message;
}
finally
{
SrcCon.Close();
DesCon.Close();
}
}


private void OnRowsCopied(object sender, SqlRowsCopiedEventArgs args)
{
lblCounter.Text += args.RowsCopied.ToString() + " rows are copied
";
TimeSpan copyTime = DateTime.Now - startTime;
lblCounter.Text += "Copy Time:" + copyTime.Seconds.ToString() + "." + copyTime.Milliseconds.ToString() + " seconds";
}
接着具体分析这几行代码:
SqlBulkCopy DesBulkOp;
DesBulkOp = new SqlBulkCopy(DesConString, SqlBulkCopyOptions.UseInternalTransaction);先生成SqlBulkCopy 实例,构造函数指定了目标数据库,使用SqlBulkCopyOptions.UseInternalTransaction是指迁移动作指定在一个Transaction当中,如果数据迁移中产生错误或异常将发生回滚。其他选项请参考MSDN。


DesBulkOp.BulkCopyTimeout = 500000000;
指定操作完成的Timeout时间


DesBulkOp.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnRowsCopied);
DesBulkOp.NotifyAfter = dt.Rows.Count;
try
{
DesBulkOp.DestinationTableName = "SrcTable";
DesBulkOp.WriteToServer(dt);
}
NotifyAfter属性指定通知通知事件前处理的数据行数,在这里指定为表的行数,并添加SqlRowsCopied事件输出整个迁移过程的时间。WriteToServer方法就是将数据源拷备到目标数据库。在使用WriteToServer方法之前必须先指定DestinationTableName属性,也就是目标数据库的表名,


我们还可以自己定义一个Transaction,例如:


SqlTransaction Transaction;
Transaction =
SrcCom.Connection.BeginTransaction();
SqlBulkCopy DesBulkOp;
DesBulkOp = new SqlBulkCopy(new SqlConnection(DesConString),
SqlBulkCopyOptions.Default,
Transaction);


try
{
//..
}
catch{}
finally
{
Transaction.Commit();
}
另外还有一个SqlBulkCopyColumnMapping类,可以让数据源字段映射到目标数据中命名不同的字段上。也就是说如果目标数据和源数据的列名不同时,可以用这个类进行映射:
SqlBulkCopyColumnMapping ColMap = new SqlBulkCopyColumnMapping("SrcCol", "DesCol");
DesBulkOp.ColumnMappings.Add(ColMap);
或者可以直接添加映射:
DesBulkOp.ColumnMappings.Add("SrcCol", "DesCol");
性能问题:
我使用上面的例子测试,迁移了2万条左右的记录,花的时间不到一秒,应改说性能还是不错的。另外,使用SQL Profile监视迁移事件,可以看见请求记录非常少,只有几条而已。据说使用SqlBulkCopy可以大大减少数据迁移的时间。


来源:网络







添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.