我有一段代码,它使用DataReader和SqlBulkCopy将数据从excel电子表格复制到MSSQL表。它工作得很好,直到我在表上创建了一个主键,现在它失败了。我首先删除SQL表的内容,然后再用excel中的数据重新填充它。
由于我移动的数据量很小,我想知道是否有比使用BulkCopy更好的方法来完成这项工作?
Update:下面是相对代码,我收到的错误是:“来自数据源的字符串类型的给定值无法转换为指定目标列的浮点数类型。”
using (OleDbConnection connection = new OleDbConnection(excelConnectionString))
{
connection.Open();
OleDbCommand cmd = new OleDbCommand
("SELECT Name, Date, Amount FROM ExcelNamedRange", connection);
using (OleDbDataReader dr = cmd.ExecuteReader())
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString))
{
bulkCopy.DestinationTableName = "SqlTable";
bulkCopy.WriteToServer(dr);
}
}
}发布于 2011-03-25 20:26:37
SqlBulkCopy会自动映射这些字段。但是,由于您添加了主键,因此该默认映射不再有效。
您必须设置ColumnMapping来明确告诉您的SqlBulkCopy对象如何映射字段。
对除主键以外的所有字段执行此操作(假设您在PK上使用身份)。
例如:
_bulkCopyEngine.ColumnMappings.Add("fieldname_from", "fieldname_to");发布于 2011-03-25 19:31:51
创建主键,表明您正在实施域约束(这是一件好事)。
因此,您的实际问题不是,而不是您需要另一种方法来执行批量插入,而是,您需要找出为什么有重复的键(强制执行PK的确切原因)。
发布于 2011-03-25 19:36:50
BulkCopy应该工作得很好,所以您的问题似乎是重复的键(错误消息是什么?)。您可能有错误的数据,或者您创建的主键太窄。
您还可以首先将数据推入一个临时表(没有键/索引等,只是一个普通表),然后使用update (在2008年时合并)语句将其放入实际的表中。
GJ
https://stackoverflow.com/questions/5431735
复制相似问题