2018年1月6日 星期六

Python 操作資料庫 (5) --- Access:ACE ODBC driver 64位元的安裝

在 x64 環境下使用 64位元 Python 去操作 32 位元的 Access 資料庫檔案,遇到了 Python 無法連結 Access 資料庫檔案的問題。
錯誤訊息:
Error: ('IM002', '[IM002] [Microsoft][ODBC \xc5X\xb0\xca\xb5{\xa6\xa1\xba\xde\xb2z\xad\xfb] \xa7\xe4\xa4\xa3\xa8\xec\xb8\xea\xae\xc6\xa8\xd3\xb7\xbd\xa6W\xba\xd9\xa5B\xa5\xbc\xab\xfc\xa9w\xb9w\xb3]\xaa\xba\xc5X\xb0\xca\xb5{\xa6\xa1 (0) (SQLDriverConnect)')

看到這錯誤還真的不好找出問題所,就思考往幾個方向去做了實驗,看看能否找出問題發生原因。
  1. 錯誤訊息貼到 Google 去找,結果都是說連結字串錯誤所造成,因此往連結字串方向去尋找,結果無功而返。
  2. 試想有沒可能因為 32位元 ACCESS 資料庫檔案從 32位元系統移置 64位元系統,造成衝突而影響,後來試了很多次重新在64位元系統下建立 32位元 ACCESS 檔案,問題依舊無解。
  3. 試想會不會可能是 pyodbc 沒有支援 64 位元,找了相關資料一樣無解,也是沒有打中問題核心。
  4. 無意間看到問題是發生在 Anaconda 64位元 + 64位元系統上,結果重新試了 Anaconda 32位元 + 64位元系統,結果 32位元 Python 程式可以連結 32位元 ACCESS 資料庫檔案 (無言,這也是應該要正常)。
  5. 最後重新 Google 關鍵字「Microsoft Access Driver (*.mdb, *.accdb)」,找到一篇關於系統 「ODBC資料來源管理員有」關的文章 「Connecting to Microsoft Access」,想說試試看有沒有解,結果發現「ODBC資料來源管理員 (32 位元) 」的驅動程式很多,包含「Microsoft Access Driver (*.mdb, *.accdb)」存在,而「ODBC資料來源管理員 (64 位元) 」卻沒有「Microsoft Access Driver (*.mdb, *.accdb)」。
「ODBC資料來源管理員 (32 位元)」。

「ODBC資料來源管理員 (64 位元)」。

這時心裡就有個底了,應該這是這個原因造成 64位元 Python 程式無法連結 32位元 ACCESS 資料庫檔案,於是到微軟官網去下載「Microsoft Access Database Engine 2010 可轉散發套件」安裝。

安裝遇到錯誤訊息,原因為系統中有安裝 ACCESS 2010 32位元版本。

移除在 ACCESS 2010 後,重新安裝「Microsoft Access Database Engine 2010 可轉散發套件」,再查看「ODBC資料來源管理員 (64 位元)」,確認已經有「Microsoft Access Driver (*.mdb, *.accdb)」存在了。

最後執行 64位元 Python 程式碼,確認可正常連結 32位元 ACCESS 資料庫檔案(淚)。

參考資料: