SQL批量插入不会将值正确插入表中

时间:2013-02-03 04:09:38

标签: .net excel sql-server-2008-r2 sqlbulkcopy

我有一个Excel文件(.xlsx),我正在尝试将文件的内容上传到Sql server表中。我使用SQL批量复制批量插入数据。数据插入到表中,但我发现数据未正确插入。

以下是Excel数据示例 -

enter image description here

这是Sql批量复制的代码:

string fname = Path.GetFileName(fup_addRoute.FileName);
fup_addRoute.SaveAs(Server.MapPath("/Admin/UserRoutes/" + fname));
string path = Server.MapPath("/Admin/UserRoutes/" + fname);

using (OleDbConnection connection = new OleDbConnection(string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 8.0", path)))
{
      OleDbCommand command = new OleDbCommand("select * from [Sheet1$]", connection);
      connection.Open();
      System.Data.Common.DbDataReader dr = command.ExecuteReader();
      SqlBulkCopy bulkInsert = new SqlBulkCopy(con); 
      bulkInsert.DestinationTableName = "routesdata";
      bulkInsert.WriteToServer(dr);
      connection.Close();
      dr.Close();
      bulkInsert.Close();
}

插入后的数据:

enter image description here

仅插入最后一行,并且缺少Excel工作表中的第一列值。表中的xid列是一个自动增量列。

在MySql中使用'load data infile'这个过程很简单,但我只是迁移到了Sql server。我的代码中我做错了什么建议请。

2 个答案:

答案 0 :(得分:3)

作为我之前评论的后续内容,由于您只缺少第一行,因此您需要在连接字符串中添加HDR=No

看起来应该是这样的:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=No';

- 编辑

请注意添加的撇号。

祝你好运。

答案 1 :(得分:2)

我实际上有点惊讶你没有报告异常。

无论如何,我怀疑(至少部分)你的问题是你需要指定列映射。

来自http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopycolumnmapping.aspx

  

如果未定义映射(即,ColumnMappings集合为空),则会根据序号位置隐式映射列。为此,源和目标模式必须匹配。如果他们不这样做,将抛出InvalidOperationException。

从我可以看到的Excel文件和数据库表中,匹配所有列(例如自动增量)。所以我会尝试指定您的column mappings