尝试使用ibm_db python软件包连接到db2时出现以下错误。
[IBM][CLI Driver] SQL4917N Element "SQLE_CLIENT_INFO_WRKSTNNAME"
in the option array is not valid. SQLCODE=-4917
此问题特定于我的新机器(2019 MacBook Pro)。我从旧计算机(2013年末MacBook Pro)的Time Machine备份中设置了这台计算机。完全相同的代码可以连接到数据库,而在我的旧计算机上没有错误。新机器可以使用SQLDeveloper程序而不是python连接到数据库。
在不同服务器上尝试不同数据库时,错误仍然存在。我正在尝试连接到Db2 Warehouse on Cloud服务。
环境:
我尝试过:
执行connect方法时出现错误:
import ibm_db
conn = ibm_db.connect(CONN_STRING, "", "")
目前,我希望python连接到数据库,但是出现以下错误:
[IBM][CLI Driver] SQL4917N Element "SQLE_CLIENT_INFO_WRKSTNNAME"
in the option array is not valid. SQLCODE=-4917
db2level命令
~/anaconda3/envs/ibm/lib/python3.6/site-packages/clidriver/bin/db2level
db2level输出
DB21085I This instance or install (instance name, where applicable: "*") uses
"64" bits and DB2 code release "SQL10055" with level identifier "0606010E".
Informational tokens are "DB2 v10.5.0.5", "special_35187", "DARWIN64105_35187",
and Fix Pack "5".
Product is installed at
"~/anaconda3/envs/ibm/lib/python3.6/site-packages/clidriver".
答案 0 :(得分:0)
该错误意味着尝试为SQLE_CLIENT_INFO_WRKSTNNAME设置无效的值。 db2 cloud应该接受一个最大为255个字节的值,并且它应默认为当前主机名,因此gethostbyname返回的某些无效字符可能是? 为了确认我们必须在执行期间收集db2cli跟踪(以查看其尝试设置的实际值)。
要测试的最简单的Python代码是运行
import ibm_db
conn = ibm_db.connect("SAMPLE","db2v111","passw0rd")
stmt = ibm_db.exec_immediate(conn,"select CURRENT client_wrkstnname from sysibm.sysdummy1")
ibm_db.fetch_tuple(stmt)
对我来说,连接工作正常,它返回我当前的主机名:
In [6]: ibm_db.fetch_tuple(stmt)
Out[6]: (u'kkuduk',)
要测试的一种解决方法是在db2cli.ini中添加其他一些值,例如如果我愿意的话:
cat /usr/lib/python2.7/site-packages/ibm_db-2.0.7-py2.7-linux-x86_64.egg/clidriver/cfg/db2cli.ini
[sample]
port=60111
hostname=localhost
database=sample
ClientWrkStnName=OverridenHostname
相同的代码返回:
In [4]: ibm_db.fetch_tuple(stmt)
Out[4]: (u'OverridenHostname',)
答案 1 :(得分:0)
ClientWrkStnName包含无效字符,如@mao和@kkuduk建议。这是由于我的旧Mac和同一网络上的新Mac之间的Mac ComputerName冲突所致。例如格雷的MacBook Pro->格雷的MacBook Pro(2)。通过从终端在新计算机上更改ComputerName和HostName可以解决此问题。
scutil --set ComputerName "graymac"
scutil --set HostName "graymac"