连接到IBM AS / 400 DB2数据库

我试图使用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 

我的odbc.ini如下所示:

 [IBM DB2 ODBC DRIVER] Driver = IBM DB2 ODBC DRIVER Description = ODBC 5.1 Driver DSN 

现在,我的代码连接是:

 $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!'; 

我得到的错误是这样的:

 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 

我也尝试使用PDO ODBC驱动程序。 这是我得到的错误:

 $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 

我在这里做错了什么? 我需要使用一些其他的驱动程序,因为用户名和密码是正确的,我看到客户端使用我有的用户名和密码login到数据库。 我以为用户名和密码是错误的,因为它说用户拒绝访问 。 似乎并非如此。 可能还有其他的东西是错的。

感谢您的帮助。 我希望我把这个问题弄清楚了。 谢谢!

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

 Driver = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so 

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

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

从IBM下载免费的iSeriesAccess-6.1.0-1.2.i386.rpm文件(您将不得不创建一个免费帐户来获取它 – 而且我确定有一个比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 

编辑/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 

然后创建与PDO的连接:

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

我不得不在最近的一个Ubuntu盒子上使用ODBC / PHP的IBM / DB2访问。 你大概可以适应这个大多数其他发行版:以下是我如何工作:

[1]根据您所需的DB2版本和体系结构,下载以下内容之一

 iSeriesAccess-5.4.0-1.6.i386.rpm iSeriesAccess-5.4.0-1.6.ppc.rpm iSeriesAccess-5.4.0-1.6.ppc64.rpm iSeriesAccess-5.4.0-1.6.x86_64.rpm iSeriesAccess-6.1.0-1.0.i386.rpm iSeriesAccess-6.1.0-1.0.ppc.rpm iSeriesAccess-6.1.0-1.0.ppc64.rpm iSeriesAccess-6.1.0-1.0.x86_64.rpm 

您可以从IBM网站或从这里获得此信息:

http://www.mmnt.net/db/0/0/public.dhe.ibm.com/as400

然后使用类似下面的方法安装IBM as400 client Access:

 sudo apt-get install alien libmotif3 cd /path/to/iSeriesAccess-6.1.0-1.0.i386.rpm sudo alien -dckv iSeriesAccess-6.1.0-1.0.i386.rpm sudo dpkg -i iseriesaccess_6.1.0-1.0_i386.deb 

[2]安装Java(如果需要)

 sudo apt-get install sun-java6-jre 

[3]安装UNIXODBC

 sudo apt-get install unixodbc-bin 

[4]安装PHP ODBC

 sudo apt-get install php5-odbc 

[5] Ldconfig用这一行创建一个文件/etc/ld.so.conf.d/iSeriesAccess.conf

 /opt/ibm/iSeriesAccess/lib/ 

然后运行以下内容:

 sudo ldconfig 

[6]注册驱动程序

 sudo odbcinst -i -d -f /opt/ibm/iSeriesAccess/unixodbcregistration 

[7]用一些PHP代码进行测试

 <?php $user = 'SomeUser'; $pass = 'SomePass'; $Conn = odbc_connect("DRIVER={iSeries Access ODBC Driver};DATABASE=DBNAME;SYSTEM=127.0.0.1;HOSTNAME=127.0.0.1;PORT=446;PROTOCOL=TCPIP", $user, $pass); if($Conn === false){ die('failed to connect'); } $sql = "select * from database.table fetch first 10 rows only"; $result=odbc_exec($Conn,$sql); echo '<pre>'; while(odbc_fetch_array(($result)){ print_r($result); } }