ZF2 PDO_IBM 具有关系数据库名称的驱动程序

ZF2 PDO_IBM Driver with Relational Database Name

有一个需要与 AS400 iSeries 数据库建立连接的 Zend Framework 2.4 连接工厂。必须以这种方式进行连接,因为有多个测试环境,工厂需要适应每个环境。

该方法使用 Zend\Db\Adapter\Adapter,我向 class 传递了一个数据库连接参数数组。

问题:Zend\Db\Adapter 不接受关系数据库(目录)名称。我假设因为驱动程序是 PDO_IBM,所以会有一些字段用于显式定义目录的名称。

方法如下:

 public function conn($dbs) {
   $this->adapter = new Adapter(array(
       'driver' => $dbs['db']['driver'],
       'dbname' => $dbs['db']['dbname'],
       'username' => $dbs['db']['username'],
       'password' => $dbs['db']['password'],
       'hostname' => $dbs['db']['hostname'],
       'port' => $dbs['db']['port'],
   ));
   var_dump($this->adapter);
   return $this->adapter;
}

适配器是\Zend\Db\Adapter\Adapter

的别名

这是创建的对象。

["driver":protected]=> object(Zend\Db\Adapter\Driver\Pdo\Pdo)#224 (4){ 
  ["connection":protected]=>object(Zend\Db\Adapter\Driver\Pdo\Connection)#225 (6) { 
["driver":protected]=> *RECURSION* 
["profiler":protected]=> NULL 
["driverName":protected]=> string(3)"ibm" 
["connectionParameters":protected]=> array(6) { 
    ["driver"]=> string(7) "PDO_IBM" 
    ["dbname"]=> string(7) “<relational_database_name>” 
    ["username"]=> string(3) “<user_name" 
    ["password"]=> string(3) “<password>" 
    ["hostname"]=> string(9) "127.0.0.1" 
    ["port"]=> string(3) "446" 
}

我可以使用以下方式实例化连接对象:

 $conn = new \Zend\Db\Adapter\Adapter( );
 Pdo=ibm:<relational_database_name> 

但这不是针对这种情况的可行解决方案。最后,这里是错误:

Connect Error: SQLSTATE=42705, SQLConnect: -950 Relational database dbname=;hos not in relational database directory.

为了完整起见,这里是适用于 Zend Server 6 上的 ZF2 Zend\Db\Adapter\Adapter 运行 并连接到 AS400 iSeries 数据库的配置。

 //concat the driver and rel. db directory name into one string
 //$dsn name is required for Zend\Db to correctly read it into memory 
 $dsn = "ibm:" . $db_dir_name;
   $this->adapter = new Adapter(array(
 'driver' => $driver,  // Pdo
 'dsn' => $dsn,
 'username' => <user_name>,
 'password' => <user_pwd>
 ));

这在任何地方都没有记录,而是通过反复试验得出的。