连接到IBM AS/400 DB2数据库

sul*_*vvr 3 db2 ubuntu unixodbc ibm-midrange

我正在尝试使用PHP的ODBC驱动程序从Ubuntu服务器连接到客户端的IBM AS/400 DB2数据库.我也安装了unixODBC.我的odbcinst.ini看起来像这样:

[IBM DB2 ODBC DRIVER]
Description = ODBC 5.1 Driver for Database
Driver = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so
FileUsage = 1
Run Code Online (Sandbox Code Playgroud)

我的odbc.ini看起来像这样:

[IBM DB2 ODBC DRIVER]
Driver = IBM DB2 ODBC DRIVER
Description = ODBC 5.1 Driver DSN
Run Code Online (Sandbox Code Playgroud)

现在,我的连接代码是:

$server = '12.345.678.90' //IP
$port = '446' //PORT
$username = 'my_username';
$password = 'my_password';

$connect = odbc_connect("DRIVER = {IBM DB2 ODBC DRIVER};System=$server:$port;Uid=$username;Pwd=$password;", $username, $password);

if(!$connect)
    echo 'Cannot Connect!';
else
    echo 'Connected!';
Run Code Online (Sandbox Code Playgroud)

我得到的错误是这样的:

Warning: odbc_connect(): SQL Error: [unixODBC][MySQL][ODBC 5.1 Driver]Access denied for user 'my_username'@'localhost' (using password: YES), SQL state S1000 in SQLConnect
Run Code Online (Sandbox Code Playgroud)

我也试过使用PDO ODBC Driver.这是我得到的错误:

$connect = new PDO("odbc:DRIVER={IBM DB2 ODBC DRIVER};HOSTNAME=$server;PORT=$port;Uid=$username;Pwd=$password");

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] SQLDriverConnect: 1045 [unixODBC][MySQL][ODBC 5.1 Driver]Access denied for user 'my_username'@'localhost' (using password: YES)' in /var/www/test_file.php Stack trace: #0 /var/www/test_file.php: PDO->__construct('odbc:DRIVER={IB...') #1 {main} thrown in /var/www/test_file.php
Run Code Online (Sandbox Code Playgroud)

我在这里做错了吗?我是否需要使用其他驱动程序,因为用户名和密码是正确的,我看到客户端使用我拥有的用户名和密码登录数据库.我认为用户名和密码错误,因为它说用户拒绝访问.似乎并非如此.可能还有别的东西是错的.

谢谢您的帮助.我希望我能很清楚地解决这个问题.谢谢!

Ben*_*ill 5

你的odbcinst.ini文件说使用MySQL ODBC驱动程序:

Driver = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so
Run Code Online (Sandbox Code Playgroud)

但您需要使用iSeries Access ODBC驱动程序.您收到Access Denied for User消息的原因是因为您尝试使用IBM i的凭据连接到MySQL数据库.

以下是有关如何在Ubuntu上连接到DB2 for i(在IBM i上)的分步说明:

iSeriesAccess-6.1.0-1.2.i386.rpm从IBM 下载免费文件(您必须创建一个免费帐户才能获得它 - 我确信有一个比6.1.0-1.2更新的版本)

将RPM文件转换为Ubuntu可以理解的内容: sudo alien iSeriesAccess-6.1.0-1.2.i386.rpm

安装生成的.deb: sudo dpkg -i iseriesaccess_6.1.0-2.2_i386.deb

将已安装的iSeries库复制到Ubuntu期望的位置: sudo cp /opt/ibm/iSeriesAccess/lib/* /usr/lib

编辑/etc/odbc.ini文件以包含:

[primary]
Description             = primary
Driver                  = iSeries Access ODBC Driver
System                  = IP_ADDRESS
UserID                  = USERNAME
Password                = PASSWORD
Naming                  = 1
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
Run Code Online (Sandbox Code Playgroud)

编辑/etc/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
Run Code Online (Sandbox Code Playgroud)

然后创建与PDO的连接:

$pdo = new PDO("odbc:DRIVER={iSeries Access ODBC Driver};SYSTEM=$server;PROTOCOL=TCPIP", $username, $password);
Run Code Online (Sandbox Code Playgroud)

  • 您可以考虑将[命名设置](http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Frzaik%2Frzaikconnstrkeywordsservprop.htm)更改为1. IBM i开发人员通常会考虑它使用库列表的最佳实践(类似于路径).[System vs SQL Naming -part 1](http://www.ibm.com/developerworks/ibmi/library/i-sqlnaming/)&[part 2](http://www.ibm.com/developerworks/ibmi /library/i-system_sql2/index.html) (2认同)