2013/01/15

[WorkLog] Preparation to read Excel file data via ODBC on Windows 2008 64bit : 在 64 位元的 Windows 2008 透過 ODBC 讀取 Excel 檔案資料的準備工作

上個星期,我把放在本機裡刻了好久的電子報管理系統放上公司的測試機,結果馬上發現有個匯入資料功能爆了,訊息是「ERROR [IM002] [Microsoft][ODBC 驅動程式管理員] 找不到資料來源名稱且未指定預設的驅動程式」。當下還有更急的事要忙,就先放著。今天,終於輪到它了。
ODBC,說來見笑,老實說我從第一份工作開始就常看到它(現在...算是第五份),但是一點都不認識它,接觸過的相關功能,都是前輩們傳便便 準備的好好的,而我以前也沒想過去挖出來看,所以跟“不會”也沒什麼不同。今天花了不少時間在處理這問題,問題是解了,不過還是覺得誤打誤撞。

(回題)

本的程式碼用了 
Dim ExcelConn As Odbc.OdbcConnection = _
    New Odbc.OdbcConnection("Driver={Microsoft Excel Driver (*.xls)};DBQ=" & _FileName & "")
假設 _FileName 值為 C:\temp.xls

接著再透過 OdbcDataAdapter 使用 sql 語法 "select * from [sheet1$]" 讀取檔案 temp.xls 的 sheet1 那頁的資料並裝到 DataTable。

在我本機的 Windows 7 - 64bit 一直沒問題,應該是有裝 Excel 2007 的關係。而且我本來以為測試機上也要裝 Excel 才行。不過,不需要。只要裝 Microsoft Access Database Engine 就可以了。下圖是一台已經早就裝好的 Windows Server 2003 - 32bit 的 ODBC 管理畫面(當初裝的大概是 Microsoft Access Database Engine 2007

著,我就也拿了 Microsoft Access Database Engine 2007 的安裝檔到 Windows Server 2008 那台測試去安裝,顯示安裝成功,可是 ODBC 管理畫面裡依然找不到 "Microsoft Excel Driver"
(此圖以 Win7 版本模擬)
我還是心存僥倖的去網頁上按了「匯入」鈕

繼續找,找到了比 2007 更新的 Microsoft Access Database Engine 2010 ,而且提供 64 位元的,安裝後,它終於出現了

心想“這下解了吧”,再跑去網頁上按了「匯入」鈕
o__O!!
還是不行!?
再仔細瞧瞧 ODBC 管理畫面
再看看程式碼
Dim ExcelConn As Odbc.OdbcConnection = _
    New Odbc.OdbcConnection("Driver={Microsoft Excel Driver (*.xls)};DBQ=" & _FileName & "")
.
.
.
Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)
.
.
.
Microsoft Excel Driver (*.xls)
.
.
.
該不會
.
.
.
把程式改一下
Dim ExcelConn As Odbc.OdbcConnection = _
    New Odbc.OdbcConnection("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" & _Files & "")
.
.
.
再按一下「匯入」鈕,“匯入成功!”

厚~原來 Driver 指定的名字就是指那個哦!(打到這,我都覺得自己笨到有點扯)

最後發現,那時我的眼睛一定是被蛤仔肉枸到,其實下載頁內容中“說明”裡就有提到
4. 如果您是使用 ODBC 連線至 Microsoft Office Excel 資料的應用程式開發人員,請將連接字串設定為“Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=path to xls/xlsx/xlsm/xlsb file” 

2 則留言:

  1. 謝謝你的這篇 我也因為這個問題卡了一天多...
    本來打算要重寫程式碼 剛剛看到你這篇後豁然開朗
    眼睛一定是被蛤仔肉枸到+1

    回覆刪除