2013-02-28 87 views
0

我有兩個數據庫,現在我必須從一個數據庫插入數據到另一個數據庫循環。我知道位sql批量複製,我不知道如何使用sql批量複製一次插入一個數據。數據插入循環使用sql bulkcopy類c#

這裏是我的表結構

CREATE TABLE [CandidateApplication](
[EmailID] [varchar](300) NOT NULL, 
[Name] [varchar](300) NULL, 
[FileName] [varchar](500) NULL, 
[IsDownloaded] [bit] NOT NULL 
) 

基本上,我需要從一個分貝就像IsDownloaded=0條款獲取數據,然後我需要在循環迭代。在循環中,我將從FileName字段獲取文件路徑並下載該文件。如果文件下載成功,那麼我必須將數據從db1保存到db2,並將字段IsDownloaded=1更新爲db1。

我可以處理數據插入從一個數據庫到另一個數據庫與循環使用sqlbulk副本類。請建議。感謝

回答

0

你不需要迭代逐個插入的數據,你需要做的就是將一個集合傳遞給WriteToServer()方法。

一個例子是:

HashSet<SomeObject> dataLines = new HashSet<SomeObject>(); 

foreach (var entity in someCollection) 
     { 
      if(entity == somecondition) 
      { 
        dataLines.Add(new SomeObject 
           { 
            CollectionItem1 = entity.Property1, 
            CollectionItem2 = entity.Property2, 
            CollectionItem3 = entity.Property3, 
            CollectionItem4 = entity.Property4, 
            CollectionItem5 = entity.Property5, 
            CollectionItem6 = entity.Property6, 
            CollectionItem7 = entity.Property7, 
           }); 
      } 
     } 
     try 
     { 
      _context.Connection.Open(); 
      EntityConnection connection = _context.Connection as EntityConnection; 
      SqlConnection sqlConnection = null; 
      if (connection != null) 
      { 
       sqlConnection = connection.StoreConnection as SqlConnection; 
      } 

      if (sqlConnection != null) 
      { 

       SqlBulkCopy bulkInsert = new SqlBulkCopy(sqlConnection); 
       bulkInsert.DestinationTableName = "SomeTable"; 
       bulkInsert.ColumnMappings.Add("CollectionItem1", "Column1"); 
       bulkInsert.ColumnMappings.Add("CollectionItem2", "Column2"); 
       bulkInsert.ColumnMappings.Add("CollectionItem3", "Column3"); 
       bulkInsert.ColumnMappings.Add("CollectionItem4", "Column4"); 
       bulkInsert.ColumnMappings.Add("CollectionItem5", "Column5"); 
       bulkInsert.ColumnMappings.Add("CollectionItem6", "Column6"); 
       bulkInsert.ColumnMappings.Add("CollectionItem7", "Column7"); 
// dataLines is a collection of objects 
       bulkInsert.WriteToServer(dataLines.AsDataReader()); 
       _context.SaveChanges(); 
      } 
     } 
     finally 
     { 
      _context.Connection.Close(); 
     } 
+0

你可以給我一點完整的代碼。給我dataLines的代碼。謝謝 – Thomas 2013-02-28 11:42:27

+0

在這種情況下的數據線只是一個Hashset AdamWhite 2013-02-28 14:05:11

+0

如何在數據插入到數據庫之前將數據分配給dataLines? – Thomas 2013-02-28 14:28:44

1

它是簡單的傢伙:)對不起我的代碼在VB.net我希望你不介意它

注:重要的是在你的數據表和目標表中的數據類型。他們應該是相同的

  1. 從DB1獲取數據,做任何你想做的事情,並在數據表中
  2. 使用準備好數據這個功能傾倒在第二數據庫中的數據

代碼:

Public Shared Function BulkSave(ByVal dt As DataTable) As Boolean 
    Dim mydb As New CSdatabase 
    Try 

    Dim connectionString = "Connection String" 
    '' so there is no need to map columns. 
     Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(connectionString) 
      bulkCopy.BatchSize = 25000 
      bulkCopy.BulkCopyTimeout = 300 

      bulkCopy.ColumnMappings.Add("EmailID", "EmailID") 
      bulkCopy.ColumnMappings.Add("Name", "Name") 
      bulkCopy.ColumnMappings.Add("FileName", "FileName") 
      bulkCopy.ColumnMappings.Add("IsDownloaded", "IsDownloaded") 
      bulkCopy.DestinationTableName = "dbo.CandidateApplication" 

      bulkCopy.WriteToServer(dt) 
     End Using 
    Catch ex As Exception 
     Throw ex 
    Finally 
     'mydb.closeConnection() ' Close your conneciton here 
    End Try 

    Return True 

End Function 
+0

的batchsize是25000排在300秒內 – 2013-02-28 09:04:13

+0

我知道如何使用SqlBulkCopy類。我的問題是不同的,當我使用SqlBulkCopy然後我可以更新數據在循環意味着一次? – Thomas 2013-02-28 09:06:19

+0

如果你想一次更新一行,那麼你不需要sqlbulkCopy。 SqlBulkCopy在這種情況下速度較慢。 – 2013-02-28 09:42:51