SqlBulkCopy类

首先:web.config

  < connectionStrings >
    
< add  name ="srcDBConnection"  connectionString ="server=.;database=pubs;uid=sa;pwd=" />
    
< add  name ="desDBConnection"  connectionString ="server=.;database=NorthWind;uid=sa;pwd=" />
  
</ connectionStrings >

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

using  System;
using  System.Data;
using  System.Configuration;
using  System.Collections;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;
using  System.Data.SqlClient;

public   partial   class  ASP_NET : System.Web.UI.Page
... {
    
private DateTime startTime;

    
protected void Button1_Click(object sender, EventArgs e)
    
...{
        startTime 
= DateTime.Now;
        
string srcConnString = "";
        
string desConnString = "";
        SqlConnection srcConnection 
= new SqlConnection();
        SqlConnection desConnection 
= new SqlConnection();
        SqlCommand sqlcmd 
= new SqlCommand();
        SqlDataAdapter da 
= new SqlDataAdapter();
        DataTable dt 
= new DataTable();
        
//srcConnString = ConfigurationManager.ConnectionStrings["srcDBConnection"].ConnectionString;
        desConnString = ConfigurationManager.ConnectionStrings["desDBConnection"].ToString();
        
//srcConnection.ConnectionString = srcConnString;
        srcConnection.ConnectionString = desConnString;
        sqlcmd.Connection 
= srcConnection;
        
//sqlcmd.CommandText = "select * from jobs";
        sqlcmd.CommandText = "select * from abc";
        sqlcmd.CommandType 
= CommandType.Text;
        sqlcmd.Connection.Open();
        da.SelectCommand 
= sqlcmd;
        da.Fill(dt);

        SqlBulkCopy sbc 
= new SqlBulkCopy(desConnString,SqlBulkCopyOptions.UseInternalTransaction);
        sbc.BulkCopyTimeout 
= 5000;
        sbc.SqlRowsCopied 
+=new SqlRowsCopiedEventHandler(OnRowsCopied);
        sbc.NotifyAfter 
= dt.Rows.Count;

        
try
        
...{
           
// sbc.DestinationTableName = "jobs";
            sbc.DestinationTableName = "bcd";
            sbc.WriteToServer(dt);
        }

        
catch (Exception ex)
        
...{
            lblCounter.Text 
= ex.Message.ToString();
        }

        
finally
        
...{
            sqlcmd.Clone();
            srcConnection.Close();
            desConnection.Close();
            
        }


    }

    
private void OnRowsCopied(object sender, SqlRowsCopiedEventArgs args)
    
...{
        lblCounter.Text 
+= args.RowsCopied.ToString() + " rows are copied<Br>";
        TimeSpan copyTime 
= DateTime.Now - startTime;
        lblCounter.Text 
+= "Copy Time:" + copyTime.Seconds.ToString() + "." + copyTime.Milliseconds.ToString() + " seconds";
    }

}

代码分析:

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

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

 sbc.SqlRowsCopied  += new  SqlRowsCopiedEventHandler(OnRowsCopied);
  sbc.NotifyAfter 
=  dt.Rows.Count;

        
try
        
... {
           
// sbc.DestinationTableName = "jobs";
            sbc.DestinationTableName = "bcd";
            sbc.WriteToServer(dt);
        }

NotifyAfter 属性指定通知通知事件前处理的数据行数,在这里指定为表的行数,并添加SqlRowsCopied事件输出整个迁移过程的时间。 WriteToServer方法就是将数据源拷备到目标数据库。在使用WriteToServer方法之前必须先指定 DestinationTableName属性,也就是目标数据库的表名,

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

create   table  abc
(
  aid 
int   identity ( 1 , 1 primary   key ,
  adesc 
varchar ( 50 not   null
)
go

/**/ /**********存储过程**********************/
create   proc  addData
as
declare   @i   int
set   @i = 1
while   @i   <   1000000
begin
insert   into  abc  values  ( ' testDescription ' )
set   @i   =   @i   +   1
end
go

select   *   into  titles  from  pubs.dbo.titles  where    1 >   3  复制跨数据库的表结构

 

 

SqlBulkCopy sqlBC = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction);
            sqlBC.DestinationTableName = "CSDN_Users";
            DataTable dt = new DataTable("CSDN_Users");
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("UserName", typeof(string));
            dt.Columns.Add("PassWord", typeof(string));
            dt.Columns.Add("Email", typeof(string));
            StreamReader sr = new StreamReader(@"D:\CSDN.txt");
            string[] userInfo;
            string readStr;
            int flag = 0;
            while (sr.Peek() > -1)
            {
                flag++;
                readStr = sr.ReadLine();
                userInfo = readStr.Split('#');
                dt.Rows.Add(0, userInfo[0], userInfo[1], userInfo[2]);
                if (flag % 100000 == 0)
                {
                    sqlBC.WriteToServer(dt);
                    dt.Clear();
                }
            }
            sqlBC.WriteToServer(dt);
            dt.Dispose();
            sqlBC.Close();
            sr.Close();

转载于:https://www.cnblogs.com/jie566/archive/2012/08/13/2636317.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`SqlBulkCopy` 是 .NET Framework 中的一个,用于将大量数据一次性批量插入到 SQL Server 数据库中,可以大大提高数据插入的效率。 使用 `SqlBulkCopy` 可以实现以下几个优点: 1. 提高数据库操作效率:`SqlBulkCopy` 可将大量数据一次性插入到数据库中,比逐条插入更高效。 2. 减少数据库操作次数:`SqlBulkCopy` 可以将多个插入操作合并为一个操作,从而减少了数据库操作次数。 3. 简化代码:使用 `SqlBulkCopy` 可以简化代码,使代码更易读、易维护。 使用 `SqlBulkCopy` 的基本步骤如下: 1. 创建一个 `SqlConnection` 对象,用于连接到 SQL Server 数据库。 2. 创建一个 `SqlBulkCopy` 对象,指定要插入数据的目标表、连接对象等参数。 3. 创建一个数据源,可以使用 `DataTable` 或 `IDataReader` 对象。 4. 调用 `SqlBulkCopy` 对象的 `WriteToServer` 方法,将数据源中的数据批量插入到数据库中。 以下是一个使用 `SqlBulkCopy` 将 `DataTable` 对象中的数据插入到 SQL Server 数据库中的示例代码: ```vb.net Using connection As New SqlConnection(connectionString) connection.Open() Using bulkCopy As New SqlBulkCopy(connection) bulkCopy.DestinationTableName = "dbo.MyTable" bulkCopy.WriteToServer(myDataTable) End Using End Using ``` 需要注意的是,`SqlBulkCopy` 只能用于向 SQL Server 数据库中插入数据,不能用于更新或删除数据。同时,使用该时需要注意数据源与目标表的列的对应关系,必须保证两者的列数和列名一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值