我需要以编程方式(ADO.Net)将记录从一个数据库中的表复制到另一个服务器上另一个数据库中的表。 这与"How can I copy data records between two instances of an SQLServer database"非常相似,只是我不允许创建指向目标服务器的链接,因此该问题的接受答案对我不起作用。
答案 0 :(得分:0)
您可以使用SqlBulkCopy类
答案 1 :(得分: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];
}
}
最后,我只使用数据适配器在目标数据库上提交更改。
答案 2 :(得分: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);
}
}
}
}