ADO.NET 新特性之SqlBulkCopy

摘要:
数据库web服务代码分析服务器。净存储空间。Net1.1对于将整个DataTable中的所有数据批量插入数据库或在不同数据源之间进行迁移并不十分方便。在里面Net2.0,在SQLClient命名空间下添加了几个新类,以帮助我们通过DataTable或DataReader批量迁移数据。数据源可以来自关系数据库或XML文件,甚至可以来自Web服务返回的结果。最重要的类之一是SqlBulkCopy类,它可以轻松地帮助我们将数据从数据源迁移到目标数据库。

数据库webservice代码分析server.net存储

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

首先:web.config

ADO.NET 新特性之SqlBulkCopy第1张 <connectionStrings>
ADO.NET 新特性之SqlBulkCopy第1张 <add name="srcDBConnection" connectionString="server=.;database=pubs;uid=sa;pwd="/>
ADO.NET 新特性之SqlBulkCopy第1张 <add name="desDBConnection" connectionString="server=.;database=NorthWind;uid=sa;pwd="/>
ADO.NET 新特性之SqlBulkCopy第1张 </connectionStrings>

C#文件: 前台不Copy了,就一个按钮,一个Label

ADO.NET 新特性之SqlBulkCopy第1张using System;
ADO.NET 新特性之SqlBulkCopy第1张using System.Data;
ADO.NET 新特性之SqlBulkCopy第1张using System.Configuration;
ADO.NET 新特性之SqlBulkCopy第1张using System.Collections;
ADO.NET 新特性之SqlBulkCopy第1张using System.Web;
ADO.NET 新特性之SqlBulkCopy第1张using System.Web.Security;
ADO.NET 新特性之SqlBulkCopy第1张using System.Web.UI;
ADO.NET 新特性之SqlBulkCopy第1张using System.Web.UI.WebControls;
ADO.NET 新特性之SqlBulkCopy第1张using System.Web.UI.WebControls.WebParts;
ADO.NET 新特性之SqlBulkCopy第1张using System.Web.UI.HtmlControls;
ADO.NET 新特性之SqlBulkCopy第1张using System.Data.SqlClient;
ADO.NET 新特性之SqlBulkCopy第1张
ADO.NET 新特性之SqlBulkCopy第1张public partial class ASP_NET : System.Web.UI.Page
ADO.NET 新特性之SqlBulkCopy第18张{
ADO.NET 新特性之SqlBulkCopy第19张 private DateTime startTime;
ADO.NET 新特性之SqlBulkCopy第19张
ADO.NET 新特性之SqlBulkCopy第19张 protected void Button1_Click(object sender, EventArgs e)
ADO.NET 新特性之SqlBulkCopy第22张 {
ADO.NET 新特性之SqlBulkCopy第19张        startTime = DateTime.Now;
ADO.NET 新特性之SqlBulkCopy第19张 string srcConnString = "";
ADO.NET 新特性之SqlBulkCopy第19张 string desConnString = "";
ADO.NET 新特性之SqlBulkCopy第19张        SqlConnection srcConnection = new SqlConnection();
ADO.NET 新特性之SqlBulkCopy第19张        SqlConnection desConnection = new SqlConnection();
ADO.NET 新特性之SqlBulkCopy第19张        SqlCommand sqlcmd = new SqlCommand();
ADO.NET 新特性之SqlBulkCopy第19张        SqlDataAdapter da = new SqlDataAdapter();
ADO.NET 新特性之SqlBulkCopy第19张        DataTable dt = new DataTable();
ADO.NET 新特性之SqlBulkCopy第19张 //srcConnString = ConfigurationManager.ConnectionStrings["srcDBConnection"].ConnectionString;
ADO.NET 新特性之SqlBulkCopy第19张        desConnString = ConfigurationManager.ConnectionStrings["desDBConnection"].ToString();
ADO.NET 新特性之SqlBulkCopy第19张 //srcConnection.ConnectionString = srcConnString;
ADO.NET 新特性之SqlBulkCopy第19张        srcConnection.ConnectionString = desConnString;
ADO.NET 新特性之SqlBulkCopy第19张        sqlcmd.Connection = srcConnection;
ADO.NET 新特性之SqlBulkCopy第19张 //sqlcmd.CommandText = "select * from jobs";
ADO.NET 新特性之SqlBulkCopy第19张        sqlcmd.CommandText = "select * from abc";
ADO.NET 新特性之SqlBulkCopy第19张        sqlcmd.CommandType = CommandType.Text;
ADO.NET 新特性之SqlBulkCopy第19张        sqlcmd.Connection.Open();
ADO.NET 新特性之SqlBulkCopy第19张        da.SelectCommand = sqlcmd;
ADO.NET 新特性之SqlBulkCopy第19张        da.Fill(dt);
ADO.NET 新特性之SqlBulkCopy第19张
ADO.NET 新特性之SqlBulkCopy第19张        SqlBulkCopy sbc = new SqlBulkCopy(desConnString,SqlBulkCopyOptions.UseInternalTransaction);
ADO.NET 新特性之SqlBulkCopy第19张        sbc.BulkCopyTimeout = 5000;
ADO.NET 新特性之SqlBulkCopy第19张        sbc.SqlRowsCopied +=new SqlRowsCopiedEventHandler(OnRowsCopied);
ADO.NET 新特性之SqlBulkCopy第19张        sbc.NotifyAfter = dt.Rows.Count;
ADO.NET 新特性之SqlBulkCopy第19张
ADO.NET 新特性之SqlBulkCopy第19张 try
ADO.NET 新特性之SqlBulkCopy第22张 {
ADO.NET 新特性之SqlBulkCopy第19张 // sbc.DestinationTableName = "jobs";
ADO.NET 新特性之SqlBulkCopy第19张            sbc.DestinationTableName = "bcd";
ADO.NET 新特性之SqlBulkCopy第19张            sbc.WriteToServer(dt);
ADO.NET 新特性之SqlBulkCopy第53张        }
ADO.NET 新特性之SqlBulkCopy第19张 catch (Exception ex)
ADO.NET 新特性之SqlBulkCopy第22张 {
ADO.NET 新特性之SqlBulkCopy第19张            lblCounter.Text = ex.Message.ToString();
ADO.NET 新特性之SqlBulkCopy第53张        }
ADO.NET 新特性之SqlBulkCopy第19张 finally
ADO.NET 新特性之SqlBulkCopy第22张 {
ADO.NET 新特性之SqlBulkCopy第19张            sqlcmd.Clone();
ADO.NET 新特性之SqlBulkCopy第19张            srcConnection.Close();
ADO.NET 新特性之SqlBulkCopy第19张            desConnection.Close();
ADO.NET 新特性之SqlBulkCopy第19张
ADO.NET 新特性之SqlBulkCopy第53张        }
ADO.NET 新特性之SqlBulkCopy第19张
ADO.NET 新特性之SqlBulkCopy第53张    }
ADO.NET 新特性之SqlBulkCopy第19张 private void OnRowsCopied(object sender, SqlRowsCopiedEventArgs args)
ADO.NET 新特性之SqlBulkCopy第22张 {
ADO.NET 新特性之SqlBulkCopy第19张        lblCounter.Text += args.RowsCopied.ToString() + " rows are copied<Br>";
ADO.NET 新特性之SqlBulkCopy第19张        TimeSpan copyTime = DateTime.Now - startTime;
ADO.NET 新特性之SqlBulkCopy第19张        lblCounter.Text += "Copy Time:" + copyTime.Seconds.ToString() + "." + copyTime.Milliseconds.ToString() + " seconds";
ADO.NET 新特性之SqlBulkCopy第53张    }
ADO.NET 新特性之SqlBulkCopy第73张}
ADO.NET 新特性之SqlBulkCopy第1张

代码分析:

ADO.NET 新特性之SqlBulkCopy第1张SqlBulkCopy sbc = new SqlBulkCopy(desConnString,SqlBulkCopyOptions.UseInternalTransaction);
ADO.NET 新特性之SqlBulkCopy第1张先生成SqlBulkCopy 实例,构造函数指定了目标数据库,使用SqlBulkCopyOptions.UseInternalTransaction是指迁移动作指定在一个Transaction当中,如果数据迁移中产生错误或异常将发生回滚。
ADO.NET 新特性之SqlBulkCopy第1张

sbc.BulkCopyTimeout = 5000000;    //指定操作完成的Timeout时间

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

性能方面:我在Sql中用proc插入68万条数据花了近8分钟,用SqlBulkCopy花了53.234秒~,效率高了7倍耶!不过现在也不做这方面的底层了,呵呵,把自己写的一个测试存储过程也贴上吧,方便自己学习

ADO.NET 新特性之SqlBulkCopy第1张create table abc
ADO.NET 新特性之SqlBulkCopy第1张(
ADO.NET 新特性之SqlBulkCopy第1张  aid int identity(1,1) primary key,
ADO.NET 新特性之SqlBulkCopy第1张  adesc varchar(50) not null
ADO.NET 新特性之SqlBulkCopy第1张)
ADO.NET 新特性之SqlBulkCopy第1张go
ADO.NET 新特性之SqlBulkCopy第1张
ADO.NET 新特性之SqlBulkCopy第18张/**********存储过程**********************/
ADO.NET 新特性之SqlBulkCopy第1张create proc addData
ADO.NET 新特性之SqlBulkCopy第1张as
ADO.NET 新特性之SqlBulkCopy第1张declare @i int
ADO.NET 新特性之SqlBulkCopy第1张set @i=1
ADO.NET 新特性之SqlBulkCopy第1张while @i < 1000000
ADO.NET 新特性之SqlBulkCopy第1张begin
ADO.NET 新特性之SqlBulkCopy第1张insert into abc values ('testDescription')
ADO.NET 新特性之SqlBulkCopy第1张set @i = @i + 1
ADO.NET 新特性之SqlBulkCopy第1张end
ADO.NET 新特性之SqlBulkCopy第1张go
ADO.NET 新特性之SqlBulkCopy第1张
ADO.NET 新特性之SqlBulkCopy第1张select * into titles from pubs.dbo.titles where 1> 3 复制跨数据库的表结构

免责声明:文章转载自《ADO.NET 新特性之SqlBulkCopy》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇word2vec改进之Hierarchical Softmax关于HTML的简述下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【Oracle】CentOS7/CentOS8命令行安装Oracle 11G R2

写在前面 很长一段时间内,国内互联网公司都在提倡“去IOE”,但是很多企业还是愿意为昂贵的Oracle数据库买单,不少读者所在的公司也在用Oracle,很多读者自行安装Oracle数据库时,多多少少遇到了些问题,苦恼于几天下来还是没能解决问题。这不,不少读者跑来问我,让我输出一篇如何在物理机上安装Oracle的文章,最好是安装过程中不会出现各种“疑难杂症”...

使用Oracle DBLink进行数据库之间对象的访问操作

Oracle中自带了DBLink功能,它的作用是将多个oracle数据库逻辑上看成一个数据库,也就是说在一个数据库中可以操作另一个数据库中的对象,例如我们新建了一个数据database1,我们需要操作数据库database2中的表,或者我们需要操作远程机器上数据库database3中的表,我们就可以使用dblink这个强大的功能!1、我们如果要创建全局的D...

拒绝了对对象 'sp_OACreate' (数据库 'mssqlsystemresource',架构 'sys')的 EXECUTE 权限。

执行一个存储过程, 由于里面使用到了一些 --创建对象 EXEC sp_OACreate 'VBScript.RegExp', @objRegexOUT --设置属性 EXEC sp_OASetProperty @objRegex, 'Pattern', @pattern EXEC sp_OASetProperty @objRegex, 'Ign...

一次SQLServer数据库宕机问题

数据库采用SQL Server 2005版本, 数据库文件约为6G,而LDF日志文件已经高达36G。 服务器开始变的不太稳定 。数据没有成功保存。 打开事件查看器发现很多信息日志 数据库 '' 中的文件 '_log' 的自动增长已由用户取消,或已在 30031 毫秒后超时。请使用 ALTER DATABASE 为此文件设置较小的 FILEGROWTH 值...

删除 Dblink 报错 ORA02024: database link not found 的解决方法

  朋友说删除DBLINK 报错:ORA-02024: database link not found。   在Metalink上搜到了2篇与这个错误有关的文章:        Cannot drop a database link after changing the global_name ORA-02024 [ID 382994.1]       ...

Centos5 下redmine的安装及配置

Redmine: 这是基于ROR框架开发的一套跨平台项目管理系统,是项目管理系统的后起之秀,据说是源于Basecamp的ror版而来,支持多种数据库,除了和 DotProject的功能大致相当外,还有不少自己独特的功能,例如提供wiki、新闻台、时间跟踪、feed聚合、导出pdf等待,还可以集成其他版 本管理系统和BUG跟踪系统,例如SVN、CVS、TD...