2013-02-03 56 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