System.InvalidOperationException:给定的 ColumnMapping 与源或目标中的任何列都不匹配

Jiale Xue - MSFT 46,296 信誉分 Microsoft 供应商
2024-04-03T06:14:49.41+00:00

嗨,大家好...

我遇到以下错误:

System.InvalidOperationException:给定的 ColumnMapping 与源或目标中的任何列都不匹配。 在 System.Data.SqlClient.SqlBulkCopy.AnalyzeTargetAndCreateUpdateBulkCommand (BulkCopySimpleResultSet internalResults) 在 System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalRestContinuedAsync (BulkCopySimpleResultSet internalResults, CancellationToken cts, TaskCompletionSource1 源) 在 System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalAsync (CancellationToken ctoken) 在 System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerAsync (Int32 columnCount, CancellationToken ctoken) 在 System.Data.SqlClient.SqlBulkCopy.WriteToServer (DataTable 表, DataRowState rowState)...1 source) at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalRestAsync(CancellationToken cts, TaskCompletionSource

执行 sqlBulkCopy.WriteToServer(dataTable) 时会引发异常。请参阅以下代码:

    using (var sqlConnection = new SqlConnection(connectionString))  
    {  
        sqlConnection.Open();  
        using (var sqlBulkCopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity))  
        {  
            sqlBulkCopy.DestinationTableName = dataTable.TableName;  

            foreach (DataColumn column in dataTable.Columns)  
                sqlBulkCopy.ColumnMappings.Add(column.ColumnName, column.ColumnName);  

            //var i = 0;  

            //foreach (DataColumn column in dataTable.Columns)  
            //{  
            //    SqlBulkCopyColumnMapping columnMapping = sqlBulkCopy.ColumnMappings[i++];  
            //    Console.WriteLine("{0}\t{1}\t{2}", column.ColumnName, column.ColumnName == columnMapping.SourceColumn, column.ColumnName == columnMapping.DestinationColumn);  
            //}  

            sqlBulkCopy.WriteToServer(dataTable);  
        }  
    }  

注释的调试代码生成以下输出:

98360-image.png

我花了几个小时在这上面。我错过了什么?我做错了什么?

Note:此问题总结整理于: System.InvalidOperationException: The given ColumnMapping does not match up with any column in the source or destination

.NET
.NET
基于 .NET 软件框架的 Microsoft 技术。
62 个问题
SQL Server
SQL Server
Microsoft 关系数据库管理和分析系统的一个系列,用于实现电子商务、业务线和数据仓库解决方案。
163 个问题
C#
C#
一种面向对象的类型安全的编程语言,它起源于 C 语言系列,包括对面向组件的编程的支持。
187 个问题
.NET 运行时
.NET 运行时
.NET: 基于 .NET 软件框架的 Microsoft 技术。运行时: 运行未编译为机器语言的应用所需的环境。
54 个问题
0 个注释 无注释
{count} 票

接受的答案
  1. Hui Liu-MSFT 48,566 信誉分 Microsoft 供应商
    2024-04-03T07:23:29.6533333+00:00

    出错的原因是某些列名不一致,即使所有列都显示为 true。

    以下代码段导致此错误:

     foreach (DataColumn column in dataTable.Columns)  
              sqlBulkCopy.ColumnMappings.Add(column.ColumnName, column.ColumnName);  
    

    sqlBulkCopy.ColumnMappings 的数据来自 Datatable,然后你用它来和 Datatable 中的列名做对比,它永远是相等的。

    我认为您应该将 Datatable 的列名与数据库中表的列名进行比较。

    我建议你使用以下代码来检查它:

                        using (SqlCommand command = new SqlCommand("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'scoretable'", sqlConnection))  
                        {  
                            DataTable columnNames = new DataTable();  
                            columnNames.Load(command.ExecuteReader());  
      
                            int i = 0;  
                            foreach (DataColumn column in dataTable.Columns)  
                            {  
                                string columnNameInDB = columnNames.Rows[i++]["COLUMN_NAME"].ToString();  
                                Console.WriteLine("{0}\t{1}\t{2}", column.ColumnName, columnNameInDB, columnNameInDB == column.ColumnName);  
                            }  
                        }  
    
    
    

    如果回复有帮助,请点击“接受答案”并点赞。 注意:如果您想接收此线程的相关电子邮件通知,请按照我们文档中的步骤启用电子邮件通知。

    1 个人认为此答案很有帮助。
    0 个注释 无注释

0 个其他答案

排序依据: 非常有帮助

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。