柔情似水 发表于 2015-1-16 22:42:01

ASP.NET网页设计.net2.0中利用SqlBulkCopy举行多量量数...

计算机发展到这个时候,很多技术日益成熟,想学好一种技术都是不容易的,当你学会用的时候你对它的很多原理可能很不了解)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";
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怎么样,我懂的少,问的可能很幼稚,见笑了啊:)

透明 发表于 2015-1-19 21:19:45

有一丝可惜的是,这个系列太强了,Java阵营的朋友根本就是哑口无言...争论之火瞬间被浇灭,这不是我想这么早就看到的,但是值了。

莫相离 发表于 2015-1-26 23:52:11

众所周知,Windows以易用而出名,也因此占据不少的服务器市场。

爱飞 发表于 2015-2-4 23:01:41

如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。

兰色精灵 发表于 2015-2-10 22:33:58

我的意思是.net好用,从功能上来说比JAVA强还是很明显的。

admin 发表于 2015-3-1 16:53:49

弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。

飘灵儿 发表于 2015-3-10 21:09:52

现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。

小女巫 发表于 2015-3-17 10:10:23

市场决定一切,我个人从经历上觉得两者至少在很长时间内还是要共存下去,包括C和C++,至少从找工作就看得出来,总不可能大家都像所谓的时尚一样,追捧一门语言并应用它。

不帅 发表于 2015-3-17 10:10:23

在一个项目中谁敢保证每天几千万甚至几亿条的数据不丢失?谁敢保证应用的高可靠性?有可以借签的项目吗?

分手快乐 发表于 2015-3-24 06:34:58

ASP在执行的时候,是由IIS调用程序引擎,解释执行嵌在HTML中的ASP代码,最终将结果和原来的HTML一同送往客户端。
页: [1]
查看完整版本: ASP.NET网页设计.net2.0中利用SqlBulkCopy举行多量量数...