2009-12-16 69 views

回答

0

下面是我做到的。感謝其他響應者的靈感。如果兩個表的模式相同,則構建映射的代碼不是必需的。

public void CopyTables(string sourceConnectionString, string destConnectionString) 
{ 
     string sql = "Select * From SourceTable"; 
     using (SqlConnection sourceConn = new SqlConnection(sourceConnectionString)) 
     using (SqlCommand sourceCmd = new SqlCommand(sql, sourceConn)) { 
      sourceConn.Open(); 

      using (SqlDataReader reader = sourceCmd.ExecuteReader()) 
      using (SqlBulkCopy copier = new SqlBulkCopy(destConnectionString)) { 
       copier.DestinationTableName = "DestinationTable"; 
       copier.BulkCopyTimeout = 300; 

       DataTable schema = reader.GetSchemaTable(); 
       copier.ColumnMappings.Clear(); 
       foreach (DataRow row in schema.Rows) { 
        copier.ColumnMappings.Add(row["ColumnName"].ToString(), row["ColumnName"].ToString()); 
       } 

       copier.WriteToServer(reader); 
      } 
     } 
    } 
} 
0

通過santiiii建議SqlBulkCopy類是非常有效的,但它創建了一個非日誌記錄操作。我不得不這樣做一次,但我的目標數據庫參與了複製,所以我需要將操作完全記錄下來。我最終做的是從源數據庫中選擇一個數據集。

Select * from SourceDatabaseTable where (some clause to get the right records) 

然後用這個說法

Select * from DestinationDatabaseTable where 1<>1 

然後,我有兩個數據集建立從目標表一個空的數據集。第一個是我想要複製的記錄,第二個是空的。接下來,我只是做了一個嵌套的foreach循環來將記錄從一個數據集複製到另一個數據集。這裏是核心複製函數的僞代碼:

foreach(datarow sourcedr in sourcetable) 
{ 
    datarow destdr = destdatatable.createrow(); 
    foreach(datacolumn in sourcedatatable) 
    { 
     destdr[datacolumn]=Sourcedr[datacolum]; 
    } 
} 

最後,我只是使用數據適配器來提交目標數據庫上的更改。

相關問題