[英]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.