2009-12-16 42 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]; 
    } 
} 

最后,我只是使用数据适配器来提交目标数据库上的更改。

相关问题