库列表未在与IBM i

时间:2017-02-28 21:11:52

标签: php db2 ibm-midrange db2-400

我已经通过PHP从本地Windows PC成功连接到远程IBM i DB2数据库(AS400)。我正在将IBM Data Server Client与PHP中的db2_*函数结合使用。我遇到的问题是,尽管我的库列表设置正确,但它不用于非限定表名。相反,它使用当前用户名作为库。但是,当我对表名进行限定时,一切都像魅力一样。

我通过查询QSYS2.LIBRARY_LIST_INFO确认我的库列表实际上正在发生变化。

$database = '<database name>';
$user = '<user name>';
$password = '<password';
$port = <port>;

$options['i5_naming'] = DB2_I5_NAMING_ON;
$options['autocommit'] = DB2_AUTOCOMMIT_OFF;
$options['i5_libl'] = 'MYLIB YOURLIB ANYLIB';

$conn = db2_connect($database, $user, $password, $options);

if ($conn) {
    echo "Connection succeeded."; //It succeeds

}
else {
    echo db2_conn_error()." | ".db2_conn_errormsg()."<br />";
    echo "Connection failed.";
}

$sql = "SELECT * FROM QSYS2.LIBRARY_LIST_INFO"; 
//Works and proves my library list reflects 
//what I passed in when creating the connection.

//$sql = "SELECT * FROM LIBRARY_LIST_INFO";
//Generates: "42S02 : [IBM][CLI Driver][AS] SQL0204N "<user name>.LIBRARY_LIST_INFO" is an undefined name. SQLSTATE=42704 SQLCODE=-204"
//where <user name> is the username used to connect to the DB.
//It should be using the library list specified when creating the connection though.  
//This holds true for any table from any library including those specified 
//when creating the connection (which includes QSYS2).

$stmt = db2_prepare($conn, $sql);
$result = db2_execute($stmt);
if($result){
    while($row = db2_fetch_assoc($stmt)){
        echo "<pre>";
        var_dump($row);  //In addition to entries for QSYS, QSYS2, QUSRSYS and QHLPSYS I get entries for MYLIB, YOURLIB and ANYLIB.
        echo "</pre>";
    }
}else{
    echo "failed<br />";
    echo db2_stmt_error()." : ".db2_stmt_errormsg()."<br />";
}

有没有人在连接到远程DB2服务器时启用i5_naming时遇到此问题?我不确定为什么它不会使用我的库列表,因为PHP手册指出“使用作业的库列表解析了不合格的文件”。何时启用。 http://php.net/manual/en/function.db2-connect.php

1 个答案:

答案 0 :(得分:1)

我在与IBM开启PMR之后终于解决了这个问题。我所要做的就是应用最新的DB2 Connect个人版修订包。

DB2 Connect的建议修订包:

http://www-01.ibm.com/support/docview.wss?rs=71&uid=swg21321001

基本上我的DB2 Connect版本是在2013年之前发布的。在2013年,IBM通过添加i5_naming选项添加了两层支持。所以我的DB2 Connect设置实际上忽略了我传递的选项。这就解释了为什么其他选项仍然存在。在数据库方面,因为它没有收到i5_naming的值 - 它仍然是默认值。