簡體   English   中英

SqlBulkCopy - 給定的ColumnName與源或目標中的任何列都不匹配

[英]SqlBulkCopy - The given ColumnName does not match up with any column in the source or destination

我正在嘗試使用SqlBulkCopy將數據復制到SQL數據庫表中,但它(錯誤地)說列不匹配。 他們匹配。 如果我使用斷點來查看要映射的列的名稱,它們是正確的。 錯誤消息顯示列的名稱,並且它是正確的。

這是我的方法。 我有一個的工作,唯一的區別是哪里得到的列名相同的方法。 但是,包含列名的字符串完全相同。

    public static bool ManualMapImport(DataTable dataTable, string table)
    {
        if(dataTable != null)
        {
            SqlConnection connection = new SqlConnection(connectionString);
            SqlBulkCopy import = new SqlBulkCopy(connection);
            import.DestinationTableName = "[" + table + "]";
            foreach (string s in Global.SelectedColumns)
            {                    
            /* The s string variable here is the EXACT same as
               the c.ToString() in the other method below */

                if (ColumnExists(table, s))
                    import.ColumnMappings.Add(s, s); 
                else
                    return false;
            }

            connection.Open();
            import.WriteToServer(dataTable); //Error happens on this line
            connection.Close();

            return true;
        }
        else
        {
            return false;
        }
    }

這是幾乎完全相同的工作方法:

    public static bool AutoMapImport(DataTable dataTable, string table)
    {
        if (dataTable != null)
        {
            SqlConnection connection = new SqlConnection(connectionString);
            SqlBulkCopy import = new SqlBulkCopy(connection);
            import.DestinationTableName = "[" + table + "]";           
            foreach (DataColumn c in dataTable.Columns)
            {
                if (ColumnExists(table, c.ToString()))
                    import.ColumnMappings.Add(c.ToString(), c.ToString());
                else
                    return false;
            }

            connection.Open();
            import.WriteToServer(dataTable);
            connection.Close();

            return true;
        }
        else
        {
            return false;
        }
    }

如果有幫助,列名稱為:ACT_Code,ACT_Paid,ACT_Name,ACT_Terminal_Code,ACT_TCustom1,ACT_TCustom2。 這些在數據庫本身完全相同。 我知道SqlBulkCopy映射區分大小寫,並且列名確實是正確的。

這是錯誤消息:

System.Data.dll中發生了未處理的“System.InvalidOperationException”類型異常

附加信息:給定的ColumnName“ACT_Code”與數據源中的任何列都不匹配。

希望我只是遺漏了一些明顯的東西,但我很好,真的迷失了。

非常感謝。

編輯:對於任何發生與我有同樣問題的人,這是我如何解決它。

我沒有讓ManualMapImport()方法成為ManualMapImport()的近乎克隆, AutoMapImport()讓它循環遍歷數據表的列並更改名稱,然后使用修改后的數據表調用AutoMapImport() ,無需嘗試映射完全沒有字符串。

根據MSDN( 此處 ), DataColumn.ToString()方法返回“ 表達式值,如果設置了屬性;否則,返回ColumnName屬性。 ”。

我總是發現ToString()方法無論如何都會變得很糟糕(可以根據當前狀態/條件進行更改),所以我建議使用ColumnName屬性,因為這就是你實際上試圖從ToString()獲取的東西。


SQLBulkCopy ,那么我不得不猜測這是源數據表中列的名稱區分大小寫的問題,因為SQLBulkCopy 非常區分大小寫,即使SQL DB不是。 為了解決這個問題,我想說當你檢查該列是否存在時,你應該返回/使用數據表列列表本身的實際字符串,而不是使用傳入的任何字符串。這應該能夠修復您的ColumnsExist例程可能忽略的任何大小寫或重音差異。

我有同樣的問題......這條消息可能看起來有點誤導,因為它表明你沒有執行正確的映射。

為了找到問題的根源,我決定一步一步地添加表列並調用WriteToServer方法。

假設您有一個有效的列映射,您必須確保源DataTable和目標表之間的以下內容:

  • 列類型和長度(!)匹配
  • 您已為每個非空( NOT NULL )目標列提供了有效值

如果您不控制您的標識列值並希望SQL Server為您執行此任務,請確保指定SqlBulkCopyOptions.KeepIdentity選項。 在這種情況下,您不會將標識列添加到源。

這應該是您的批量插入工作的全部內容。 希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM