4

我正在尝试调整 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.

我相信这是因为<databaseName>.<tableName>当查询通过 Zend 运行时,我的前缀被双引号括起来。我无法解释为什么 Zend 在 userName 下寻找我的表。但是,我无法让 PDO 识别没有前缀的表,即使我已经尝试在 PDO 的初始化中以我能想到的各种方式声明我的数据库。

PDO 有没有办法实际获取数据库名称,所以我不需要前缀?或者有没有办法告诉 Zend 使用前缀(不在表名的引号中)?

如果我在这里使用了错误的语言,请原谅 - 当我在 SQL 和 iSeries 之间切换时,我在模式、数据库、库、文件、表等之间有点迷失了。

我非常感谢您提供的任何帮助,Zend 对我来说是新手。

4

3 回答 3

2

对PDO不熟悉,因为我用的是ibm_db2,但是用CL命令可以查到数据库名WRKRDBDIRE

使用 *SQL 命名时,未限定的表名 ( SELECT * FROM TABLENAME) 隐含地使用用户配置文件名称限定。因此,如果 SARAHK 正在执行选择,它将变为SELECT * FROM SARAHK.TABLENAME. 因此,您看到的错误表明 IBM i 认为您的表名不合格。

如果您可以将 ODBC 驱动程序配置为使用 *SYSTEM 命名,它将使用库列表来定位不合格的表名。

我是一个老派的 RPG 程序员,所以对传统的名字比较熟悉;这是一个备忘单:

  • 库 -> 架构
  • 文件 -> 表格
  • 成员 -> 没有等效的 SQL - 使用 ALIAS
于 2013-07-13T02:08:40.533 回答
2

我刚刚完成了转换教程以使用 ODBC 驱动程序连接到 IBM i 的过程,但不想在连接字符串中指定(又名硬编码)库。将“NAMING”参数设置为“1”(*SYS 而不是 *SQL)将使用用户连接/配置文件/JOBD 的 *USRLIBL(WRKJOBD INLLIBL( ...) )。如果使用 *SQL 命名,则在搜索表时会以 User ID 作为 Schema。

我的 DSN 如下所示:

'dsn' => "odbc:DRIVER={iSeries Access ODBC Driver};SYSTEM= your host IP;HOSTNAME=your host;DATABASE=your dbname;NAMING=1"

只要我要查找的表在 *LIBL 中,我就不必担心客户端的架构。

于 2015-09-16T17:10:41.180 回答
1

我通过最终找到一个添加到我的 DSN 来解决这个问题,该添加正确地指定了我想要工作的库/模式。这个站点(http://www.sqlthing.com/HowardsODBCiSeriesFAQ.htm)给了我这个参数,在尝试了,和许多其他DBQ=<libraryName>之后终于为我工作了。DATABASEDBNAME

现在我的库已在我的连接字符串中正确指定,我不需要为表名添加前缀,这样我的查询就可以工作,即使我从未让 Zend 在构建 TableGateway 时采用模式。我暂时将其标记为答案,但如果有人知道如何将模式名称发送到新的 TableGateway,我会很乐意改变它。

于 2013-07-15T17:48:53.337 回答