2009-11-02 50 views
2

直接從Excel中的活動工作表中將數據導入SQL Server數據庫的最快方法是什麼?什麼是從Excel中的活動工作表導入到SQL Server的最快方法?

我只是循環遍歷行和列,生成一個SQL字符串,打開一個ADODB.Connection並執行SQL,取得了巨大的成功。然而,這個解決方案對於大型數據集來說太慢了。

所以我正在用ADO測試Jet Provider。這絕對是更快的,但它需要保存工作簿,並且我不能要求用戶在從工作簿上傳之前保存工作簿。

如果工作簿已保存,但是如果ActiveWorkbook從未保存,則以下代碼可以工作ActiveWorkbook.Path返回空字符串,代碼失敗。

Sub UploadViaJet() 

    Dim objADO As New ADODB.Connection 
    Dim strSQL As String 
    Dim lngRecsAff As Long 

    Set objADO = New ADODB.Connection 

    objADO.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
     "Data Source=" & ActiveWorkbook.Path & _ 
     "\" & ActiveWorkbook.Name & ";" & _ 
     "Extended Properties=Excel 8.0" 

    strSQL = "SELECT * INTO [odbc;Driver={SQL Server};" & _ 
     "Server=<server>;Database=<database>;" & _ 
     "UID=<UID>;PWD=<PWD>].test_table " & _ 
     "FROM [" & ActiveSheet.Name & "$]" 

    objADO.Execute strSQL, lngRecsAff, adExecuteNoRecords 

End Sub 

有沒有更簡單快捷的方法來做到這一點?

回答

1

解決方案使用導入Excel

既然你有沒有強迫用戶保存文件的限制,大多數提出的解決方案需要將文件保存,我會用VBA來

  • 在內存中創建的工作簿對象從活動工作表
  • 複製粘貼到工作簿
  • SAVEAS工作簿到一個臨時文件名(TempExcelFile.xls)和路徑
  • 使用上述Quassnoi的方法導入到SQL Server
  • 用零覆蓋TempExcelFile.xls
  • 刪除TempExcelFile.xls

這樣,用戶不會被強制保存工作表,他們將被提示保存,就像他們在工作的自然過程中一樣。

爲了便於同時導入多個活動工作表,我將使用時間戳或GUID來創建文件名。使用ADO查詢


解決方案讓您的用戶從具有內置確保您保護工作簿,以防止宏/代碼未經授權的訪問背後的VBA宏模板創建自己的工作簿。

執行一個宏,它將循環遍歷行和列,讀取單元格值,構建SQL查詢並執行它 - 使用帶參數的存儲過程來防止注入攻擊。

+0

爲什麼不使用Windows臨時文件API? – 2009-11-03 03:29:06

+0

這是一個好主意,除了該問題指出不應提示用戶保存該文件。所以,將內容複製到不同的文件並使用Windows Temp File API將是我的選擇。 – 2009-11-03 13:20:32

+0

到目前爲止,我一直在使用ADO分佈式查詢。它對我來說運行良好,但是我的數據量已經增長到很長一段時間,並且有時會超過計算機的內存容量。使用臨時文件似乎是一個很好的解決方案,即使它需要管理臨時文件。謝謝Raj! – Kuyenda 2009-11-16 20:07:36

1

通常我使用SSIS導入大型Excel文件。

+0

除非保存工作簿,否則無法完成 – 2009-11-02 22:24:59

+0

HLGEM,您能詳細說明SSIS嗎?我正在尋找在Excel中使用SSIS的入門書,但還沒有找到任何有價值的東西。你有任何示例代碼?謝謝。 – Kuyenda 2009-11-16 20:08:48

2

您可以創建一個數據源(使用鏈接的服務器或OPENROWSET),只是做了SELECTSQL Server方:

SELECT * 
INTO mytable 
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=C:\myfile.xls', 'SELECT * FROM [Sheet$]') 

Excel工作簿的路徑應該是由SQL Server訪問。

這是關於如何做到這一點的KB article

+0

這需要將工作簿首先上傳到服務器,對嗎? – Kuyenda 2009-11-02 22:05:23

+0

它應該可以通過'SQL Server'訪問,即'UNC'路徑也能工作。但一般來說,是的,它應該上傳。 – Quassnoi 2009-11-02 22:15:01

+0

是的,這確實需要保存文件。看到我的答案可能的解決方案。 – 2009-11-02 22:32:13

0

您是否嘗試過在頂部添加一個ActiveWorkBook.SaveAs(「一些臨時文件名」),並從中導入?我使用類似於宏的方法來將ActiveSheet的內容FTP到遠程服務器,並且它可以工作。

相關問題