3

我正在尝试在 Mac OS X 上使用 pyodbc 连接到 DB2 数据库,但我似乎无法做到这一点。在类似的条件下,我已经成功使用 FreeTDS 连接到 MS SQL Server。

首先,我安装了 IBM 的 db2exc_client_952_MAC_x86_64。成功安装后,我去通过 ODBC 管理器添加驱动程序。

ODBC 管理员

然后我尝试运行这个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;');

我收到这个错误:

Traceback(最近一次调用最后一次):文件“”,第 1 行,在 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 问题,但我不确定如何破译其余的错误。

有任何想法吗?

4

3 回答 3

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”或“Host CCSID”等选项?

默认情况下,我认为 CCSID 是 37(美国/加拿大),我认为 Unicode 是 1208。

于 2012-10-11T20:08:40.253 回答
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;
于 2012-10-11T19:31:11.817 回答
0

为什么不使用驱动程序定义用户 DSN,然后在 connect() 方法中使用 DSN?

pyodbc.connect( 'DSN=MYDSN;UID=MYUSER;PWD=MYPASS' )

顺便说一句,使用“iSeries Access ODBC Driver”以外的任何驱动程序都可能引发那些 DB2 许可错误。也许这就是消息所说的。

安装“IBM i Access for Windows 7.1”时安装驱动程序

于 2018-08-23T19:58:28.617 回答