.net SQLBulk将行从一个表复制到另一个表,但列顺序不同

.net SQLBulk将行从一个表复制到另一个表,但列顺序不同,.net,sql-server,sqlbulkcopy,.net,Sql Server,Sqlbulkcopy,我在两个不同的服务器上有两个表。表有相同的列,但顺序不同,无法执行批量复制 我试着去做 var copier = new SqlBulkCopy(destination_connection); copier.DestinationTableName = destination_table_name; foreach (DataColumn column in source_table.Columns) { var map

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

我试着去做

        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);
但这对我没有帮助,并且引发了一个异常

p、 我使用.NET4.0

编辑1:

例外是

指定的ColumnMapping与数据源或目标中的任何列都不匹配

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

回答问题“有没有办法找出哪一个映射导致错误?”

是的,使用一个简单的消除过程。首先,使用硬编码的列名仅映射单个列。让它发挥作用。如果你连一个专栏都做不到,那就有更根本的问题了。(例如,目标表可能不是您认为的那样)

一旦您将其用于单个列,然后添加更多列,一次一列。当它再次开始失败时,这就是有问题的列。

回答问题“有没有办法找出哪一个映射导致错误?”

是的,使用一个简单的消除过程。首先,使用硬编码的列名仅映射单个列。让它发挥作用。如果你连一个专栏都做不到,那就有更根本的问题了。(例如,目标表可能不是您认为的那样)


一旦您将其用于单个列,然后添加更多列,一次一列。当它再次开始失败时,这就是有问题的列。

这就是我在应用程序中用于
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
;相反,我对列名使用重载方法(尽管这不重要)我的表中的列名与我的数据库中的列名完全相同。

检查数据库中的列名/类型是否与datatable中的列名相同。还要确保datatable和数据库中的列数相同。如果列的名称不同,则必须像这样手动添加列映射

bulkCopy.ColumnMappings.Add("dataTableColumn1", "databaseColumn1");
bulkCopy.ColumnMappings.Add("dataTableColumn2", "databaseColumn2");
...

这就是我在应用程序中用于
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
;相反,我对列名使用重载方法(尽管这不重要)我的表中的列名与我的数据库中的列名完全相同。

检查数据库中的列名/类型是否与datatable中的列名相同。还要确保datatable和数据库中的列数相同。如果列的名称不同,则必须像这样手动添加列映射

bulkCopy.ColumnMappings.Add("dataTableColumn1", "databaseColumn1");
bulkCopy.ColumnMappings.Add("dataTableColumn2", "databaseColumn2");
...

您确定1)所有源列都存在于目标中,2)它们都拼写相同,3)它们都具有相同的数据类型吗?任何这些都可能导致错误。不确定为什么否决对我来说似乎是一个完全合法的问题。否决是因为缺少异常详细信息,OP似乎没有采取任何措施来解决问题或帮助诊断问题。缺少的详细信息也是我投赞成票的原因。@usr如果你告诉OP你还期望什么,他们可能会添加它。@usr,我用错误详细信息更新了问题。我认为您不需要整个堆栈。您确定1)所有源列都存在于目标中,2)它们都拼写相同,3)它们都具有相同的数据类型吗?任何这些都可能导致错误。不确定为什么否决对我来说似乎是一个完全合法的问题。否决是因为缺少异常详细信息,OP似乎没有采取任何措施来解决问题或帮助诊断问题。缺少的详细信息也是我投赞成票的原因。@usr如果你告诉OP你还期望什么,他们可能会添加它。@usr,我用错误详细信息更新了问题。我不认为你需要整个堆栈。不清楚这与OP的工作有什么不同。您能指出他们的代码(或您自己的原始代码)与修复错误的代码有什么不同吗?也就是说,是什么错误导致了这个错误?我在他编辑之前就开始写了。我更新了我的答案,补充了一点解释。现在还不清楚这和OP的做法有什么不同。您能指出他们的代码(或您自己的原始代码)与修复错误的代码有什么不同吗?也就是说,是什么错误导致了这个错误?我在他编辑之前就开始写了。我用更多的解释更新了我的答案。你说得对。一个列名拼写错误。通过明确的消除,我成功地控制了它。你说得对。一个列名拼写错误。通过明确的消除,我做到了