2012-10-09 79 views
3

我試圖在Mac OS X上使用pyodbc連接到DB2數據庫,而且我似乎無法完成這項任務。我已經成功使用FreeTDS在類似條件下連接到MS SQL Server。在Mac OSX上使用pyodbc的DB2

首先,我從IBM安裝了db2exc_client_952_MAC_x86_64。成功安裝後,我去通過ODBC管理員添加驅動程序。

ODBC Administrator

然後我試着運行這條巨蟒:

import pyodbc 
cnxn = pyodbc.connect('Driver={IBM DB2 ODBC Driver}; Hostname=myhost.com; Port=50300; Protocol=TCPIP; Database=DB2ET; CurrentSchema=SCHM1; UID=MYUID; PWD=MYPWD;'); 

我收到此錯誤:

Traceback (most recent call last): File "", line 1, in pyodbc.Error: ('HY000', '[] \xf8\x92\x90\x81\x9b\xf8\x93\x90\x81\x82\xf8\x96\xb0\x81\x9d\xf8\x93\x80\x81\x83\xf8\x88\x80\x81\x89\xf8\x9c\xa0\x81\x84\xf8\x9d\xa0\x81\xa9\xf8\x9c\xa0\x81\xa5\xf8\x88\x80\x81\x9d\xf8\x94\x90\x81\x93\xf8\x8c\x90\x81\x8c\xf8\x8c\xa0\x80\xb0\xf8\x93\xa0\x80\xb4\xf8\x88\x80\x80\xa0\xf8\x88\x80\x81\x81\xf8\x98\x90\x81\xa4\xf8\x98\x90\x81\xb4\xf8\x98\x90\x81\xa2\xf8\x99\x90\x81\xb3\xf8\x98\xb0\x80\xa0\xf8\x9b\xa0\x81\xaf\xf8\x99\x90\x81\xae\xf8\x9d\x80\x81\xa3\xf8\x9b\xb0\x81\xa9\xf8\x88\x80\x81\xae\xf8\x9b\xb0\x81\xa4\xf8\x9c\xb0\x81\xa5\xf8\x9b\xa0\x80\xa0\xf8\x9d\x80\x81\xaf\xf8\x99\x90\x80\xa0\xf8\x9a\x90\x81\xb8\xf8\x9d\x80\x81\xb3\xf8\x88\x80\x80\xae\xf8\x94\xb0\x80\xa0\xf8\x93\x80\x81\x91\xf8\x95\x80\x81\x93\xf8\x95\x80\x81\x81\xf8\x8f\x90\x81\x85\xf8\x8e\x80\x80\xb0\xf8\x8c\x80\x80\xb0\xf2\xa0\x80\xb3\xfc\xa0\x9c\xb0\x80\x80\xfd\xa1\x99\x82\x81\xa1\xfd\xa1\x98\xa6\x85\xb4\xfd\xa9\x88\x86\x95\xb3\xfd\x82\x91\x82\x81\xae\xfd\xaf\x99\xa2\x80\xb2\xfd\x96\x93\x92\x81\xb2\xfd\x93\x82\xa2\xb9\x93\xff\x7f (-1024) (SQLDriverConnect)')

我從搜索該HY000可能是一個問題的connectionString聚集,但我不知道如何解讀其餘的錯誤。

任何想法?

+0

您是否已經計算出了這一項?我無法在ODBC管理員中設置ODBC驅動程序。 – cabe56

+0

@ cabe56不,我不明白這一點。我的下一個想法是使用類似於http://py4j.sourceforge.net/index.html的東西,因爲我可以在我的Mac上使用DbVisualizer訪問DB2(我相信在內部使用JAVA) – macca1

回答

1

看起來連接字符串因數據庫而異,而且您使用的連接字符串與DB2不兼容。

下面是一些DB2實例連接字符串:

http://www.connectionstrings.com/ibm-db2

這是我能找到的,什麼是DB2連接字符串中有效的最佳參考:此基礎上

http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=%2Fcom.ibm.swg.im.dbclient.adonet.ref.doc%2Fdoc%2FDB2ConnectionClass.html

,我會轉換您的連接字符串:

Driver={IBM DB2 ODBC Driver}; Hostname=myhost.com; Port=50300; Protocol=TCPIP; Database=DB2ET; CurrentSchema=SCHM1; UID=MYUID; PWD=MYPWD; 

要:

Driver={IBM DB2 ODBC Driver}; Server=myhost.com:50300; Database=DB2ET; CurrentSchema=SCHM1; UID=MYUID; PWD=MYPWD; 
+0

感謝您的建議,但我在轉換爲連接字符串後,仍然看到相同的亂碼錯誤。我已經嘗試了10多種連接字符串,目前還沒有任何工作。在我原來的帖子中的那個實際上是一個在Windows上工作的。 – macca1

+0

嗯。此鏈接http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=%2Fcom.ibm.db2.luw.apdv.cli.doc%2Fdoc%2Fr0000584.html表示HY000表示它希望提示進行對話,因爲連接字符串中的信息不足。在數據庫服務器上是否設置了某種策略,不允許您在連接字符串中內聯UID和PWD?你是否嘗試過一個沒有UID和PWD的連接字符串來查看會發生什麼?就此而言,沒有數據庫和CurrentSchema? –

1

這裏是我的連接字符串的樣子在PHP(我知道你正在使用Python,但我認爲他們是非常相似):

$this->db_connection = new PDO("odbc:DRIVER={iSeries Access ODBC Driver};SYSTEM=10.xxx.xxx.xxx;PROTOCOL=TCPIP", $temp_username, $temp_password); 

請注意,我說的「SYSTEM = ...」,你說「Hostname = ...」 - 我認爲這可能很重要。

DSN是否完全設置?在我的Linux機器上,我有兩個包含DSN全部配置信息的文件。

ODBC.INI

[primary] 
Description    = primary 
Driver     = iSeries Access ODBC Driver 
System     = xxx.xxx.xxx.xxx 
UserID     = xxxxxxxxxx 
Password    = xxxxxxxxxx 
Naming     = 0 
DefaultLibraries  = QGPL 
Database    = xxxxxxxxxx 
ConnectionType   = 0 
CommitMode    = 2 
ExtendedDynamic   = 0 
DefaultPkgLibrary  = QGPL 
DefaultPackage   = A/DEFAULT(IBM),2,0,1,0,512 
AllowDataCompression = 1 
LibraryView    = 0 
AllowUnsupportedChar = 0 
ForceTranslation  = 0 
Trace     = 0 

和ODBCINST.INI

[iSeries Access ODBC Driver] 
Description  = iSeries Access for Linux ODBC Driver 
Driver   = /usr/lib/libcwbodbc.so 
Setup   = /usr/lib/libcwbodbcs.so 
NOTE1   = If using unixODBC 2.2.11 or later and you want the 32 and 64-bit ODBC drivers to share DSN's, 
NOTE2   = the following Driver64/Setup64 keywords will provide that support. 
Driver64  = /usr/lib/lib64/libcwbodbc.so 
Setup64   = /usr/lib/lib64/libcwbodbcs.so 
Threading  = 2 
DontDLClose  = 1 
UsageCount  = 1 

我相信你輸入你顯示對話框中類似的信息,可能是DSN選項卡下。

您是否啓用了ODBC跟蹤?要在Linux中執行此操作,我必須將其添加到odbcinst中。ini文件:

[ODBC] 
Trace = Yes 
TraceFile = /tmp/odbc.log 

這爲我傾倒了大量的信息,並幫助診斷我過去遇到的一些問題。

根據此頁面(http://code.google.com/p/pyodbc/wiki/ConnectionStrings),「最重要的是要知道的是,pyodbc甚至不看連接字符串 - 它是直接傳遞給未經修改的SQLDriverConnect。「如果這是真的,那麼將你的「主機名」改爲「系統」應該是有用的。

編輯

這有可能是編碼問題嗎? Unicode試圖與UTF-8服務器(或類似的東西)交談?你有沒有嘗試過設置CCSID?在配置驅動程序時,您是否有諸如「BinAsChar」,「CCSID」或「主機CCSID」等選項?

默認情況下,我相信CCSID是37(美國/加拿大),我認爲Unicode是1208.