zoukankan      html  css  js  c++  java
  • 使用SqlBulkCopy类加载其他源数据到SQL表[转]

    MSDN摘要:Microsoft SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表既可以在同一个服务器上,也可以在不同服务器上)。SqlBulkCopy 类允许编写提供类似功能的托管代码解决方案。还有其他将数据加载到 SQL Server 表的方法(例如 INSERT 语句),但相比之下 SqlBulkCopy 提供明显的性能优势。 使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据。protected void btnBulkCopy_Click(object sender, EventArgs e)   
    {       
    String ShajarConString =ConfigurationManager.ConnectionStrings["DSN_Shajar"].ConnectionString;      
      String NorthWindConString = ConfigurationManager.ConnectionStrings["DSN_Northwind"].ConnectionString;     
      SqlConnection ShajarCon = new SqlConnection(ShajarConString);  
      SqlConnection NorthwindCon = new SqlConnection(NorthWindConString);
    string sql1 = " SELECT ID, First_Name, Last_Name, " +" 'Shajar' as Source FROM MailingList_Temp "; 
    SqlCommand ShajarCom = new SqlCommand(sql1,ShajarCon);
    SqlDataReader ShajarReader;
     ShajarCon.Open();
    SqlBulkCopy NorthWindBulkOp= new SqlBulkCopy(NorthWindConString, SqlBulkCopyOptions.UseInternalTransaction);        NorthWindBulkOp.DestinationTableName = "Employees"; 
    NorthWindBulkOp.ColumnMappings.Add("Id", "EmployeeID");
     NorthWindBulkOp.ColumnMappings.Add("First_Name", "FirstName");
    NorthWindBulkOp.ColumnMappings.Add("Last_Name", "LastName"); 
    SqlBulkCopyColumnMapping JobTitleColMap= new SqlBulkCopyColumnMapping("Source1", "Title"); 
    NorthWindBulkOp.ColumnMappings.Add(JobTitleColMap);
     NorthWindBulkOp.BulkCopyTimeout = 500000000;
    NorthWindBulkOp.SqlRowsCopied +=  new SqlRowsCopiedEventHandler(OnRowsCopied);
    NorthWindBulkOp.NotifyAfter = 1000; 
    ShajarReader = ShajarCom.ExecuteReader();
    try       
    {           
    NorthWindBulkOp.WriteToServer(ShajarReader);  
    }      
      catch (Exception ex)

    lblResult.Text = ex.Message; 
    }       
    finally

    ShajarReader.Close();
    }
    }
    private void OnRowsCopied(object sender, SqlRowsCopiedEventArgs args) 

    lblCounter.Text += args.RowsCopied.ToString() + " rows are copied<Br>";
    }
    看Professional ASP.NET 2.0里的代码首先定义一个SqlDataReader从源数据读取数据然后定义一个SqlBulkCopy实例构造函数参数为 connectionString  定义将打开的且由 SqlBulkCopy 实例使用的连接的字符串。 copyOptions  SqlBulkCopyOptions 枚举中的值的组合,该枚举确定将哪些数据源行复制到目标表中。DestinationTableName属性定义了要复制表的目标名称ColumnMappings返回一个SqlBulkCopyColumnMapping项集合,SqlBulkCopyColumnMappingCollection.Add 方法参数为数据源类名称,目标表中目标列的名称也可以先定义一个SqlBulkCopyColumnMapping,然后使用Add方法添加NotifyAfter指定生成通知事件之前要处理的行数NorthWindBulkOp.SqlRowsCopied +=             new SqlRowsCopiedEventHandler(OnRowsCopied);指定在每次处理行完成的时候发生的事件,比如每次复制了1000行以后就提示1000行复制完成最后WriteToServer方法,把SqlDataReader复制到指定的表中2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>我们经常要在一个表中将数据迁移到另一个表,当然,用的方法十分多了。在.net 2.0中,提供了一个sqlbulkcopy类,也可以实现如下的操作,下面简单介绍下。比如一个表如下CREATE TABLE Person3(PersonID int IDENTITY(1,1) PRIMARY KEY, Name nvarchar(200), Email nvarchar(200), Picture image )INSERT INTO Person3(Name,Email,Picture) SELECT Name,Email,Picture FROM Person假设person表已经存在了,则上面的语句可以往person3表中插入数据(在sql server 2005中执行)。现在我们使用下面的代码来实现   string connectionString = ConfigurationManager.ConnectionStrings["MyDatabase"].ConnectionString; SqlConnection myConnection = new SqlConnection(connectionString);SqlCommand myCommand = new SqlCommand("SELECT * FROM Person", myConnection);myConnection.Open();SqlDataReader dr = myCommand.ExecuteReader();SqlConnection myNewConnection = new SqlConnection(connectionString);myNewConnection.Open();SqlBulkCopy bulk = new SqlBulkCopy(myNewConnection);bulk.DestinationTableName = "[Person3]";try{ bulk.WriteToServer(dr);}catch (Exception ex){Response.Write(ex.Message);}finally{myNewConnection.Close();dr.Close();myConnection.Close();bulk.Close();}  下面来解析下。首先,新建一个数据库连接,之后是很经典的代码了,从person表中拿出数据,当到datareader中去。之后,我们又新建立了个数据连接,之后,使用SqlBulkCopy bulk = new SqlBulkCopy(myNewConnection);bulk.DestinationTableName = "[Person3]";其中,将mynewconnection作为参数传到 sqlbulkcopy类的构造参数中去,并指定目标迁移的表名是person3.   之后,再使用bulk.WriteToServer(dr);就可以迁移了。    而上面的person表和person3的结构是完全相同的,那么如果结构不同的,怎么办呢?下面举例子说明,创建一个表person2  CREATE TABLE Person2 ( PersonID int IDENTITY(1,1) PRIMARY KEY, FirstName nvarchar(200),LastName nvarchar(200), Email nvarchar(200), Picture image) 如果我们按上面将person表迁移到person2表中去,将会出错,因为字段不同,而我们将采用下面的代码  string connectionString = ConfigurationManager.ConnectionStrings["MyDatabase"].ConnectionString; SqlConnection myConnection = new SqlConnection(connectionString);SqlCommand myCommand = new SqlCommand("SELECT * FROM Person", myConnection);myConnection.Open();SqlDataReader dr = myCommand.ExecuteReader();SqlConnection myNewConnection = new SqlConnection(connectionString);myNewConnection.Open();SqlBulkCopy bulk = new SqlBulkCopy(myNewConnection);bulk.DestinationTableName = "[Person2]";bulk.ColumnMappings.Add("Name", "LastName");bulk.ColumnMappings.Add("Email", "Email");bulk.ColumnMappings.Add("Picture", "Picture"); try{ bulk.WriteToServer(dr);}catch (Exception ex){Response.Write(ex.Message);}finally{myNewConnection.Close();dr.Close();myConnection.Close();bulk.Close();}  可以看到,这里使用bulk.ColumnMappings.Add(“。。。”,“。。。”)来强制规定,源目标字段和哪一个目标表的字段相匹配了。   据说用sqlbulkcopy类,在数据多的情况下,性能是十分好的,呵呵。
  • 相关阅读:
    request.getParameter() 、 request.getInputStream()和request.getReader() 使用体会
    HTTP之Content-Length
    关于spring3中No Session found for current thread!and Transaction的配置和管理(转)
    Java数据类型和MySql数据类型对应一览
    Spring MVC 解读——View,ViewResolver(转)
    LeetCode 441. Arranging Coins
    LeetCode 415. Add Strings
    LeetCode 400. Nth Digit
    LeetCode 367. Valid Perfect Square
    LeetCode 326. Power of Three
  • 原文地址:https://www.cnblogs.com/ivanyb/p/1070964.html
Copyright © 2011-2022 走看看