我正在尝试使用 SqlBulkCopy 将数据复制到 SQL 数据库表中,但它(错误地)说列不匹配。他们确实匹配。如果我使用断点来查看正在映射的列的名称,它们是正确的。错误消息显示了列的名称,并且它是正确的。
这是我的方法。我有一个相同的方法does工作,唯一的区别是它从哪里获取列名。但是,包含列名称的字符串完全相同。
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.InvalidOperationException”类型的未处理异常
发生在System.Data.dll中
附加信息:给定的 ColumnName“ACT_Code”不匹配
与数据源中的任何列一起。
希望我只是在这里遗漏了一些明显的东西,但我确实迷失了。
非常感谢。
编辑:对于任何碰巧遇到与我相同问题的人,以下是方法
我修好了它。
而不是拥有ManualMapImport()
方法是一个近乎克隆的AutoMapImport()
,我让它循环遍历数据表的列
并更改名称,然后调用AutoMapImport()
与修改后的
数据表,无需尝试使用纯字符串进行映射
全部。