我有一段代码使用DataReader和SqlBulkCopy将数据从excel电子表格复制到MSSQL表。它工作正常,直到我在表上创建一个主键,现在它失败了。我首先删除SQL表的内容,然后再使用excel中的数据填充它。
由于它只是我移动的少量数据,我想知道是否有比使用BulkCopy更好的方法吗?
更新:下面是相关代码,我收到的错误是: “数据源中String类型的给定值无法转换为指定目标列的float类型。”
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);
}
}
}
答案 0 :(得分:3)
SqlBulkCopy自动映射字段。但是,由于您添加了一个主键,默认映射不再有效。
您必须设置ColumnMapping以明确告诉您的SqlBulkCopy对象如何映射字段。
对所有字段执行此操作,但主键除外(假设您在PK上使用标识)。
例如:
_bulkCopyEngine.ColumnMappings.Add("fieldname_from", "fieldname_to");
答案 1 :(得分:2)
创建主键,建议您执行域约束(这是一件好事)。
因此,您的实际问题不您需要另一种方法来执行批量插入,但您需要找出重复键的原因(精确)执行PK的原因。)
答案 2 :(得分:0)
BulkCopy应该可以正常工作,所以你的问题似乎是一个重复的键(错误信息是什么?)。您要么拥有错误的数据,要么您创建的主键太窄。
您还可以做的是首先将数据推送到临时表(没有键/索引等,只是一个普通表),然后使用更新(2008年时合并)语句将其放入实际表中。
GJ
答案 3 :(得分:0)
还要确保列对齐。不确定SqlBulkCopy如何映射列,我认为它只是将NamedRange中的第一列放入SqlTale的第一列等。所以请确保它们;按正确的顺序排列。 (或者看看如果更改名称会发生什么)
答案 4 :(得分:-1)
BulkCopy是最快的方法,如何从C#向MSSQL插入数据。