2013-02-03 57 views
0

我有一个Excel文件(.xlsx),我试图将文件的内容上传到Sql服务器表中。 Iam使用SQL批量复制批量插入数据。数据被插入到表中,但我发现数据没有正确插入。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

只有最后一行被插入并且f Excel表格中的第一列值缺失。表中的xid列是一个自动增量列。

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

+0

你只得到最后一行或只是没有收到第一行? – sgeddes

+0

对不起,我刚刚发现我只是错过了第一行。 – Cdeez

+1

尝试添加HDR = NO到您的连接字符串... – sgeddes

回答

2

我实际上有点惊讶你不报告例外。

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

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

如果映射没有定义,也就是说,ColumnMappings集合是空列映射隐含基于顺序位置。为此,源模式和目标模式必须匹配。如果他们不这样做,则会抛出InvalidOperationException。

从我可以看到你的Excel文件和数据库表做匹配所有列(例如自动递增)。所以我会试着指定你的column mappings

+0

只是一个猜测,第一个罗阿我 – Hiten004

+0

对不起,关于顶级评论。那是一个错误。对不起 – Hiten004

+0

太棒了,您的解决方案解决了自动增量字段的问题。谢谢。哦,现在谁的答案我接受,sdegges解决了一个,你解决了另一个问题。 – Cdeez

3

作为我之前评论的后续内容,由于您只错过了第一行,因此您似乎需要将HDR=No添加到连接字符串中。

它应该是这个样子:

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

--edit

请注意加引号。

祝你好运。

+0

很抱歉,在添加HDR =否后会生成异常; '无法找到可安装的ISAM.' – Cdeez

+0

请参阅http:// stackoverflow。com/questions/512143/error-could-not-find-installable-isam/512187#512187 – Nathan

+0

http://stackoverflow.com/a/644365/1073631 - 看看是否没有帮助 - 我只是复制和粘贴:) – sgeddes