【发布时间】:2015-11-13 02:14:24
【问题描述】:
我正在尝试使用 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.InvalidOperationException”类型的未处理异常 发生在 System.Data.dll
附加信息:给定的 ColumnName 'ACT_Code' 不匹配 与数据源中的任何列一致。
希望我只是在这里遗漏了一些明显的东西,但我完全迷失了。
非常感谢。
编辑:对于碰巧遇到与我相同问题的任何人,方法如下 我修好了它。
而不是让
ManualMapImport()方法是一个近乎克隆的AutoMapImport(),我让它遍历数据表的列 并更改名称,然后将修改后的名称称为AutoMapImport()数据表,无需尝试使用纯字符串进行映射 全部。
【问题讨论】:
-
什么是
Global.SelectedColumns,它来自哪里/如何填充?我以为是DataGridView中的SelectedColumns属性,但它不返回字符串。 -
这只是一个
List<string>填充列名。它是通过在数据库中查询所选表中的列列表并将其放入Global.AllColumns列表来填充的,然后用户可以选择他们想要的那些,以对应于他们将打开的 CSV 文件的顺序应用程序。选择的列被复制到Global.SelectedColumns -
那是 exact 信息吗?它看起来不像我记得的......?
-
还有,什么版本的SQL server?
-
这是准确的消息,复制并粘贴。它是 2014 express,但这个应用程序将与各种版本一起使用。
标签: c# sql-server sqlbulkcopy