【问题标题】:Zend PDO ODBC Database selectionZend PDO ODBC 数据库选择
【发布时间】:2013-07-11 14:41:28
【问题描述】:

我正在尝试调整 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 运行时,我的前缀 &lt;databaseName&gt;.&lt;tableName&gt; 被双引号括起来。 我无法解释为什么 Zend 会在 userName 下查找我的表。但是,我无法让 PDO 识别没有前缀的表,即使我已经尝试在 PDO 的初始化中以各种方式声明我的数据库我能想到。

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

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

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

【问题讨论】:

    标签: pdo db2 odbc zend-framework2 ibm-midrange


    【解决方案1】:

    我刚刚完成了转换教程以使用 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 中,我就不必担心客户端的架构。

    【讨论】:

      【解决方案2】:

      我最终通过在我的 DSN 中找到了一个能够正确指定我想要使用的库/模式的附加项来解决这个问题。这个网站 (http://www.sqlthing.com/HowardsODBCiSeriesFAQ.htm) 给了我参数DBQ=&lt;libraryName&gt;,在尝试了DATABASEDBNAME 和许多其他人之后,它终于为我工作了。

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

      【讨论】:

      • 我将连接字符串更改为'odbc:DRIVER={iSeries Access ODBC Driver};SYSTEM=&lt;serverName&gt;;HOSTNAME=&lt;serverName&gt;;DBQ=&lt;libraryName&gt;'(我想 - 已经有一段时间了)
      【解决方案3】:

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

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

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

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

      • 库 -> 架构
      • 文件 -> 表格
      • 成员 -> 没有等效的 SQL - 使用别名

      【讨论】:

      • 感谢您帮助我了解用户默认设置和备忘单!不幸的是,配置驱动程序对我不起作用,但希望有此问题的人能从您的建议中受益。
      猜你喜欢
      • 2012-06-17
      • 2014-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多