【问题标题】:Connecting to an IBM AS/400 DB2 Database连接到 IBM AS/400 DB2 数据库
【发布时间】:2013-10-11 15:12:28
【问题描述】:

我正在尝试使用 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

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

感谢您的帮助。我希望我把问题说得很清楚。谢谢!

【问题讨论】:

    标签: ubuntu db2 ibm-midrange unixodbc


    【解决方案1】:

    我最近必须在 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 (根据反馈,这会打开 NSFW 弹出窗口。这不是我的网站,对此感到抱歉 - 如果您有疑虑,请访问 IBM 网站)。

    然后使用类似这样的方式安装 IBM as400 客户端 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] 配置文件 使用此行创建文件/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);
        }
    }
    

    【讨论】:

    • 指向 mmnt.com 的链接会打开 NSFW 弹出窗口。
    【解决方案2】:

    您的 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 for 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);
    

    【讨论】:

    • 感谢回复,我已经安装了iSeriesAccess-7.1.0-1.0x86_64.rpm,因为我无法安装i386。让我试试你提供的那个。但我无法为 i386 架构安装。谢谢。让我试试这个然后回复你。非常感谢!
    • 您提供的 odbcinst.ini 与我的唯一区别是:Driver = /opt/ibm/iSeriesAccess/lib64/libcwbodbc.so Setup = /opt/ibm/iSeriesAccess/lib64/libcwbodc.so 其他一切都一样。我尝试使用 PDO 进行连接,但收到的错误消息是找不到 libcwbodbc.so。任何想法?谢谢。
    • 您可能会考虑将Naming setting 更改为1。IBM i 开发人员通常认为使用库列表(类似于路径)是最佳实践。 System vs SQL Naming -part 1 & part 2
    • 如果您的服务器是 v6.1 或 v7.1,并且是最新的(TR 5+ ?),那么“系统命名”允许在“sql 命名”中使用 schema.table 表示法。跨度>
    • (旁注:您可能会惊讶地发现您的 AS/400 可能实际上并不是一个 AS/400。IBM 在 2000 年发布了最后一个。该产品线被重新命名为 iSeries ,但后来与 pSeries 合并,目前称为 Power Systems,运行 IBM i。)
    猜你喜欢
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 2011-07-11
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多