SqlBulkCopy从一个表到另一个表的行,但具有不同的列顺序

时间:2014-07-23 14:10:37

标签: .net sql-server sqlbulkcopy

我在两个不同的服务器上有两个表。那些表有相同的列,但顺序不同,我不能执行批量复制;

我试图做

        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与数据源或目标中的任何列都不匹配。

但我确定所有列都具有相同的名称和类型。有没有办法找出哪一个映射导致错误?

2 个答案:

答案 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");
...