我正在尝试使用Mac OS X上的pyodbc连接到DB2数据库,我似乎无法实现这一目标。我已经成功使用FreeTDS在类似条件下连接到MS SQL Server。
首先,我从IBM安装了db2exc_client_952_MAC_x86_64。成功安装后,我通过ODBC Administrator添加了驱动程序。
然后我尝试运行这个python:
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;');
我收到此错误:
追踪(最近一次通话): 文件“”,第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 :(得分:1)
似乎连接字符串因数据库而异,您使用的连接字符串与DB2不兼容。
这是一些DB2示例连接字符串:
http://www.connectionstrings.com/ibm-db2
这是我在DB2连接字符串中有效的最佳参考:
基于此,我将转换您的连接字符串:
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;
答案 1 :(得分: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。
答案 2 :(得分:0)
为什么不使用驱动程序定义用户DSN,然后在connect()方法中使用DSN?
pyodbc.connect( 'DSN=MYDSN;UID=MYUSER;PWD=MYPASS' )
另外,使用“ iSeries Access ODBC驱动程序”以外的任何驱动程序可能会引起那些DB2许可错误。也许这就是消息的意思。
在安装“ IBM i Access for Windows 7.1”时已安装驱动程序