我在两个不同的服务器上有两个表。那些表有相同的列,但顺序不同,我不能执行批量复制;
我试图做
var copier = new SqlBulkCopy(destination_connection);
copier.DestinationTableName = destination_table_name;
foreach (DataColumn column in source_table.Columns) {
var mapping = new SqlBulkCopyColumnMapping(column.ColumnName, column.ColumnName);
copier.ColumnMappings.Add(mapping);
}
copier.WriteToServer(source_table);
但这对我没有帮助,并且引发了InvalidOperationException。
P.S。我使用.NET 4.0
编辑1:
例外是
指定的ColumnMapping与数据源或目标中的任何列都不匹配。
但我确定所有列都具有相同的名称和类型。有没有办法找出哪一个映射导致错误?
答案 0 :(得分:3)
回答问题" 有没有办法找出哪一个映射导致错误?"
是的,使用简单的消除过程。首先使用硬编码列名称仅映射单个列。让它工作。如果你甚至无法让一个专栏工作,那么就会出现一些更根本的错误。 (例如,您的目标表可能不是您认为的那样)。
让它为单个列工作后,再一次添加一列。当它再次开始失败时,那就是有问题的列。
答案 1 :(得分:2)
这是我在我的应用程序中用于SqlBulkCopy
的内容
SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionStringSettings.ConnectionString);
bulkCopy.BulkCopyTimeout = 0; // Sets the timeout to unlimited
// Iterates through each column in the datatable
foreach (DataColumn column in table.Columns)
{
// Makes a connection map between the datatable and the database table
bulkCopy.ColumnMappings.Add(column.ColumnName, column.ColumnName);
}
// Sets the desitination table
bulkCopy.DestinationTableName = table.TableName;
bulkCopy.WriteToServer(table);
我没有创建SqlBulkCopyColumnMapping
;相反,我使用重载方法的列名称(虽然这应该无关紧要)。 我的表中的列名与我的数据库中的列名完全相同。
检查数据库中的列名称/类型是否与数据表中的列名称相同。还要确保数据表和数据库中的列数相同。如果列的名称不同,则必须手动添加列映射
bulkCopy.ColumnMappings.Add("dataTableColumn1", "databaseColumn1");
bulkCopy.ColumnMappings.Add("dataTableColumn2", "databaseColumn2");
...