4

ODBC 接続を使用するように Zend Skeleton アプリを適応させようとしています。次のように、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

私はibm_db2を使用しているため、PDOに精通していませんが、データベース名はCLコマンドで見つけることができますWRKRDBDIRE

*SQL 命名では、修飾されていないテーブル名 ( SELECT * FROM TABLENAME) はユーザー プロファイル名で暗黙的に修飾されます。なので、SARAHKがselectを実行していると、 となりSELECT * FROM SARAHK.TABLENAMEます。したがって、表示されているエラーは、修飾されていないテーブル名があると IBM i が認識していることを示しています。

*SYSTEM 命名を使用するように ODBC ドライバーを構成できれば、ライブラリー・リストを使用して非修飾テーブル名を見つけます。

私は昔ながらの RPG プログラマーなので、伝統的な名前の方がなじみがあります。ここにチートシートがあります:

  • ライブラリ -> スキーマ
  • ファイル -> テーブル
  • メンバー -> 同等の SQL なし - ALIAS を使用
于 2013-07-13T02:08:40.533 に答える
2

ODBC ドライバーを使用して IBM i に接続するようにチュートリアルを変換するプロセスを実行しましたが、接続文字列でライブラリーを指定 (別名ハードコード) したくありませんでした。「NAMING」パラメーターを '1' (*SQL ではなく *SYS) に設定すると、ユーザーの接続/プロファイル/JOBD (WRKJOBD INLLIBL( ...) ) の *USRLIBL が使用されます。*SQL ネーミングを使用すると、テーブルの検索時にユーザー ID がスキーマとして使用されます。

私の 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 に答える