0

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

这是示例 Excel 数据-

在此处输入图像描述

这是 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();
}

插入后的数据:

在此处输入图像描述

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

这个过程在 MySql 中使用“加载数据文件”很容易,但我刚刚迁移到 Sql 服务器。我在代码中做错了什么。请提出建议。

4

2 回答 2

3

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

它应该看起来像这样:

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

- 编辑

请注意添加的撇号。

祝你好运。

于 2013-02-03T04:30:48.960 回答
2

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

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

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

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

从我可以看到您的 Excel 文件和您的数据库表在所有列上都不匹配(例如自动增量)。所以我会尝试指定你的列映射

于 2013-02-03T04:21:20.873 回答