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