事由:python腳本做事務的時候 cx_Oracle連接oracle數據庫在上傳數據的時候 經常發送斷開連接而導致事務失敗,因爲沒有數據庫的管理權限,所以打算試試用JDBC和ODBC的連接方式會不會更好一點(太閒了)。在配置odbc時候有點頭疼!所以做一個記錄!
系統 :64位win10
python:3.7 64位 所以只能裝64位的odbc驅動
oracle:11.2.0.4.0 64位,選擇這個,是因爲遠程Oracle數據庫是11g的
1 安裝文件解壓
instantclient-basic-windows.x64-11.2.0.4.0.zip
instantclient-odbc-windows.x64-11.2.0.4.0.zip
instantclient-sqlplus-windows.x64-11.2.0.4.0.zip
解壓到同一目錄,如:D:\installer\oracle\instantclient_11_2
2 系統變量配置
Path :D:\installer\oracle\instantclient_11_2
ORACLE_HOME : D:\installer\oracle\instantclient_11_2
TNS_ADMIN:D:\installer\oracle\instantclient_11_2
NLS_LANG:SIMPLIFIED CHINESE_CHINA.ZHS1或者AMERICAN_AMERICA.ZHS16GBK
3 安裝odbc
管理員模式進入cmd,
cd到D:\installer\oracle\instantclient_11_2 執行odbc_install.exe
4 tns ora文件複製
32位按上述步驟就可以正常配置數據庫了
64位卻會有錯誤提示 –》添加數據庫出現錯誤14001,加載驅動失敗,並行配置不正確。
錯誤問題查找
1 Cmd命令 SxsTrace Trace -logfile:SxsTrace.etl 回車開啓追蹤
2 點擊添加odbc數據庫 出現14001錯誤
3 回到cmd窗口,enter結束追蹤
4 把追蹤文件格式轉變爲可閱讀的txt格式:SxsTrace Parse -logfile:SxsTrace.etl -outfile:SxsTrace.txt
在cmd當前目錄文件夾下找到sxstrace.txt文件,查看文本內容,其中有錯誤項,是vc80的問題,因此到微軟官網下了個vc2005 64的版本 安裝,然而配置odbc的時候還是一樣的錯誤
1 仔細看最新的sxstrace.txt內容,發現在錯誤的前一段,有描述用到安裝目錄中的Microsoft.VC80.MFC.manifest文件,然而,安裝目錄中根本沒有這個文件,
2 因此在網絡上搜索並下載了一個Microsoft.VC80.MFC.manifest放進安裝目錄。
3 用txt文本打開,把其中的版本號改成和sxstrace.txt中的錯誤部分中提及的vc版本號一致,注意64位系統要改成amd64
4 再次配置odbc,結果還是錯誤,錯誤變成了126
5 這裏不知道是什麼錯誤了,猜測是dll的問題,所以下載了Microsoft.VC80.MFC.manifest文件中提及的對應版本的dll放進安裝目錄,再次配置odbc ,錯誤變成了139。
到此,我沒有辦法了。因此把Microsoft.VC80.MFC.manifest和加進來的dll轉移到一個文件夾放好,休息一會兒,沒想到再次回來的時候 odbc配置奇蹟的成功了。我也不知道是哪一步對了....
Orcle的odbc配置要注意:
Data Source Name 自己取的名字如:"test"
Description 連接描述 這裏可不填
TNS Service Name 有兩種方式進行
一是點擊下拉tnsnames.ora配置的名稱如TEST"
二是填寫IP地址+端口號+SID 如: "ip:1521/server name"
UserID 訪問數據庫的用戶名
TNS service Name 這裏只有第二種填寫方式纔可以用python通過pyodbc進行連接,否則連接會失敗:提示無效的連接字符串屬性,
而且連接必須用dsn方式連接
conn = pyodbc.connect ('DSN=Data Source Name;PWD=******')
直接用字符串連接的方式(運行錯誤)
constr = 'DRIVER={Oracle in instantclient_11_2};’
constr = constr + ‘SERVER=ip:1521;’
constr = constr +’DATABASE=Data Source Name;UID=UserID;PWD=******'
cnxn =pyodbc.connect(constr)
錯誤提示:協議適配器錯誤,目前還不知道如何處理這個問題,但應該和服務器設置有關