|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
计算机发展到这个时候,很多技术日益成熟,想学好一种技术都是不容易的,当你学会用的时候你对它的很多原理可能很不了解)sql|数据在.Net1.1中不管是关于批量拔出全部DataTable中的一切数据到数据库中,仍是举行分歧数据源之间的迁徙,都不是很便利。而在.Net2.0中,SQLClient定名空间下增添了几个新类匡助我们经由过程DataTable或DataReader批量迁徙数据。数据源能够来自干系数据库大概XML文件,乃至WebService前往了局。个中最主要的一个类就是SqlBulkCopy类,利用它能够很便利的匡助我们把数据源的数据迁徙到方针数据库中。
上面我们先经由过程一个复杂的例子申明这个类的利用:
DateTimestartTime;
protectedvoidButton1_Click(objectsender,EventArgse)
{
startTime=DateTime.Now;
stringSrcConString;
stringDesConString;
SqlConnectionSrcCon=newSqlConnection();
SqlConnectionDesCon=newSqlConnection();
SqlCommandSrcCom=newSqlCommand();
SqlDataAdapterSrcAdapter=newSqlDataAdapter();
DataTabledt=newDataTable();
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);
SqlBulkCopyDesBulkOp;
DesBulkOp=newSqlBulkCopy(DesConString,
SqlBulkCopyOptions.UseInternalTransaction);
DesBulkOp.BulkCopyTimeout=500000000;
DesBulkOp.SqlRowsCopied+=
newSqlRowsCopiedEventHandler(OnRowsCopied);
DesBulkOp.NotifyAfter=dt.Rows.Count;
try
{
DesBulkOp.DestinationTableName="SrcTable";
DesBulkOp.WriteToServer(dt);
}
catch(Exceptionex)
{
lblResult.Text=ex.Message;
}
finally
{
SrcCon.Close();
DesCon.Close();
}
}
privatevoidOnRowsCopied(objectsender,SqlRowsCopiedEventArgsargs)
{
lblCounter.Text+=args.RowsCopied.ToString()+"rowsarecopied<Br>";
TimeSpancopyTime=DateTime.Now-startTime;
lblCounter.Text+="CopyTime:"+copyTime.Seconds.ToString()+"."+copyTime.Milliseconds.ToString()+"seconds";
}
接着详细剖析这几行代码:
SqlBulkCopyDesBulkOp;
DesBulkOp=newSqlBulkCopy(DesConString,SqlBulkCopyOptions.UseInternalTransaction);师长教师成SqlBulkCopy实例,机关函数指定了方针数据库,利用SqlBulkCopyOptions.UseInternalTransaction是指迁徙举措指定在一个Transaction傍边,假如数据迁徙中发生毛病或非常将产生回滚。其他选项请参考MSDN。
DesBulkOp.BulkCopyTimeout=500000000;
指定操纵完成的Timeout工夫
DesBulkOp.SqlRowsCopied+=newSqlRowsCopiedEventHandler(OnRowsCopied);
DesBulkOp.NotifyAfter=dt.Rows.Count;
try
{
DesBulkOp.DestinationTableName="SrcTable";
DesBulkOp.WriteToServer(dt);
}
NotifyAfter属性指定关照关照事务前处置的数据行数,在这里指定为表的行数,并增加SqlRowsCopied事务输入全部迁徙历程的工夫。WriteToServer办法就是将数据源拷备到方针数据库。在利用WriteToServer办法之前必需先指定DestinationTableName属性,也就是方针数据库的表名,
我们还能够本人界说一个Transaction,比方:
SqlTransactionTransaction;
Transaction=
SrcCom.Connection.BeginTransaction();
SqlBulkCopyDesBulkOp;
DesBulkOp=newSqlBulkCopy(newSqlConnection(DesConString),
SqlBulkCopyOptions.Default,
Transaction);
try
{
//..
}
catch{}
finally
{
Transaction.Commit();
}
别的另有一个SqlBulkCopyColumnMapping类,可让数据源字段映照到方针数据中定名分歧的字段上。也就是说假如方针数据和源数据的列名分歧时,能够用这个类举行映照:
SqlBulkCopyColumnMappingColMap=newSqlBulkCopyColumnMapping("SrcCol","DesCol");
DesBulkOp.ColumnMappings.Add(ColMap);
大概能够间接增加映照:
DesBulkOp.ColumnMappings.Add("SrcCol","DesCol");
功能成绩:
我利用下面的例子测试,迁徙了2万条摆布的纪录,花的工夫不到一秒,应改说功能仍是不错的。别的,利用SQLProfile监督迁徙事务,能够瞥见哀求纪录十分少,只要几条罢了。听说利用SqlBulkCopy能够年夜年夜削减数据迁徙的工夫。
你觉得学习.NET怎么样,我懂的少,问的可能很幼稚,见笑了啊:) |
|