2010-10-27 128 views
3

我正在將Excel文件(僅約1000條記錄)導入到專用的SQL Server數據庫。因爲我需要處理來自Excel的傳入數據(每行添加一個GUID,進行一些數據轉換),我希望逐行執行並且不想批量導入(儘管我對交易沒有任何反應)。將Excel文件逐行導入到SQL Server

我很困惑如何正確地做到這一點。我可以用一個SQLCommand與參數,像這樣:

SqlCommand sqlCommand = new SqlCommand("insert into TestTable(GUID,Name,Pricing) values(@GUID,@Name,@Pricing)", sqlConn); 
foreach (DataRow dr in ds.Tables[0].Rows) //<-- this is my Excel file to iterate through 
{ 
sqlCommander.Parameters.Clear(); 
String refGUID = Guid.NewGuid().ToString(); 
sqlCommander.Parameters.AddWithValue("GUID", refGUID); 
sqlCommander.Parameters.AddWithValue("Name", dr.ItemArray[0]); 
sqlCommander.Parameters.AddWithValue("Pricing", dr.ItemArray[1]); 
sqlCommander.ExecuteNonQuery(); 
} 

或者,我可以使用「連接」模式,像這樣:

SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT GUID, Name, Pricing FROM TestTable", sqlConn); 
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter); 

DataSet myDataSet = new DataSet(); 
dataAdapter.Fill(myDataSet, "TestTable"); 
foreach (DataRow dr in ds.Tables[0].Rows) //<-- this is my Excel file to iterate through 
{ 
DataRow row = myDataSet.Tables[0].NewRow(); 
row["GUID"] = refGUID; 
row["Name"] = dr.ItemArray[0]; 
row["Pricing"] = dr.ItemArray[1]; 
myDataSet.Tables[0].Rows.Add(row); 
dataAdapter.Update(myDataSet); 
} 

現在我的問題有以下幾點:

  1. 爲每一行發送INSERT命令(這將是SqlCommand方法)還是更好地填充特殊DataSet(第二種方法)?我猜這對於有1000個插入SQL服務器是相當「愚蠢的」?
  2. dataAdapter.Update(myDataSet) < - 我應該在迭代所有Excel行或每行(如上面的示例代碼所示)後執行該操作,這是否會奇蹟般地創建事務?
  3. 我應該使用哪種方法?還有LINQ to SQL - 爲什麼不使用它(性能可能是因爲另一層)?
  4. DataSet當讀取Excel文件時發生某些錯誤時會發生什麼 - 更新仍然推送到SQL服務器還是一切丟失?


簡而言之:我想導入Excel文件到SQL Server行由行而製作上的數據變化要導入(我不希望使用SSIS包[因爲除了數據轉換之外,我對Excel文件做了很多工作,例如將其導入Sharepoint並解僱工作流]或BizTalk)
» »如何做到這一點?
最後我繼續購買 Aspose Cells。 Aspose擁有一套非常優秀的工具。

+5

爲什麼你不想使用SSIS?如果該工具適合... – 2010-10-27 14:43:46

+0

因爲我同時將Excel文件導入Sharepoint,並創建Infopath表單和任務並啓動工作流程,所以不是簡單地導入。與使用一些SSIS包(除了基本示例之外,我從來沒有創建過這個包)相比,我更願意「掌握代碼」。 – 2010-10-27 14:54:54

+0

你的問題忽略提及新的信息....但它幾乎肯定可能在SSIS ... – 2010-10-27 15:02:43

回答

4

你提到不想使用SSIS - 但你有沒有考慮使用SqlBulkCopy?那麼除了.NET以外,不需要其他任何東西,但您仍然可以使用最快/最直接的導入。

這將接受一個DataTable,所以你可以在DataTable中準備你的數據,然後拉動觸發器。事務可以選擇支持IIRC。對於較大的數據,您還可以實現IDataReader以提供完全的流式上傳(同時仍在處理每行傳輸中)。

+0

'SqlBulkCopy'聽起來很有趣我會看看它 – 2010-10-27 15:04:36

1

給出你對問題的描述:「我想將Excel文件逐行導入到SQL服務器,同時對要導入的數據進行更改」 - SSIS是完美工具。

Importing Excel data with SQL Server Integration Services SSIS with unicode and non-unicode data issues

+0

我編輯了這篇文章,並對之前的評論發表評論以闡明。這不像將某些Excel文件導入SQL Server那樣簡單,因爲在導入過程中也會啓動其他進程。我的問題更多地是瞭解不同方法之間的差異 – 2010-10-27 15:04:02

+0

SSIS不是在SQL和Excel之間交換數據的可靠方法。太多的錯誤。 – 2010-10-27 16:53:33

1

dataSet可能會最終發送INSERT語句到服務器,所以在我看來,最好只發送沒有DataSet的INSERT語句。您還可以對流程有更多的控制,例如檢查單個行的錯誤,日誌記錄等。

0

您可以將處理的數據錶轉換爲XML並將其傳遞到Sql服務器中的存儲過程(在一個查詢中)並讓存儲過程解析XML以創建記錄。

+0

是的,我可以做到這一點。但是,爲什麼我會?爲什麼不使用DataSets? – 2010-10-27 15:05:32

-1
INSERT INTO [dbo].[TableName] 
      ([ColumnName1] 
      ,[ColumnName2]) 
) 
SELECT [ColumnName1] 
      ,[ColumnName2] 

FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0','Data Source= PathToFile.xls;Extended Properties=Excel 8.0')...[Sheet1$] 
+1

如果您發佈代碼或XML,**請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼」按鈕(101 010)以更好地格式化和語法突出顯示它! – 2010-10-27 15:36:36

+0

我的不好感謝的輸入 – Grant 2010-10-27 16:11:19