我正在尝试调整 Zend Skeleton App 以使用 ODBC 连接。我能够在 Zend 之外设置 PDO 连接(同一个表、服务器、所有内容),如下所示:
new PDO('odbc:DRIVER={iSeries Access ODBC Driver};SYSTEM=<serverName>;HOSTNAME=<serverName>;DATABASE=<databaseName>;',
'<userName>', '<password>');
$r = $this->conn->query('SELECT * FROM <databaseName>.<tableName>');
但是当我将此信息添加到 global.php 文件时:
'db' => array(
'driver' => 'Pdo',
'dsn' => 'odbc:DRIVER={iSeries Access ODBC Driver};SYSTEM=<serverName>;HOSTNAME=<serverName>;DATABASE=<databaseName>;',
),
在 local.php 中:
return array(
'db' => array(
'username' => '<userName>',
'password' => '<password>',
),
);
我收到找不到表的错误:
SQLSTATE[42S02]: Base table or view not found: 0 [IBM][iSeries Access ODBC Driver][DB2 UDB]SQL0204 - <tableName> in <userName - yes you read that right> type *FILE not found.
我相信这是因为当查询通过 Zend 运行时,我的前缀
<databaseName>.<tableName>
被包裹在双引号中。 我无法解释为什么 Zend 在 userName 下寻找我的表。 但是,我无法让 PDO 识别没有前缀的表,即使我已经尝试在 PDO 的初始化中以我能想到的各种方式声明我的数据库。PDO 有没有办法实际获取数据库名称,所以我不需要前缀?或者有没有办法告诉 Zend 使用前缀(不要与表名放在引号中)?
如果我在这里使用了错误的语言,请原谅 - 当我在 SQL 和 iSeries 之间切换时,我在模式、数据库、库、文件、表等之间有点迷失。
我非常感谢您能提供的任何帮助,Zend 对我来说是新手。
最佳答案
不熟悉 PDO,因为我使用 ibm_db2,但可以使用 CL 命令 WRKRDBDIRE
找到数据库名称。
使用 *SQL 命名时,非限定表名 ( SELECT * FROM TABLENAME
) 被隐式限定为用户配置文件名。因此,如果 SARAHK 正在执行选择,它将变为 SELECT * FROM SARAHK.TABLENAME
。所以你看到的错误表明 IBM 我认为你有一个不合格的表名。
如果您可以将 ODBC 驱动程序配置为使用 *SYSTEM 命名,它将使用库列表来定位不合格的表名。
我是一个老派的RPG程序员,所以我更熟悉传统的名字;这是一个备忘单:
关于pdo - Zend PDO ODBC 数据库选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17625349/