Current local time is .


ここに掲載してある内容は日本アイ・ビー・エム株式会社で一切サポートをしているとは限りません。あくまでも私個人または協力者のみなさんによるテスト実績等をご紹介しております。
ここに掲載してある内容について私は一切その稼働を保証はいたしませんが、ご質問等はE-Mailにて承ります。但し、その前に該当プロダクトのマニュアルはとりあえずお読みください。
このページはNetscapeNavigatorでご覧ください。
[Q].ODBCでSQLConnect(データソースとの接続)ができないのですが?
[A].ホストサーバーがインストールされていないのではありませんか。GO LICPGMの10でホストサーバーがインストールされているかどうか確認してください。ホストサーバーはバージョン3リリース1以降OS/400標準ですが、OS/400基本ではありません。またマニュアルにはQSERVERでないとODBCは使えないような記述がありますが、QCMNでLU名から生成されるジョブ名でODBCは動くこともできます。ただし、その場合はデフォルトのクラスよりプライオリティは50になりますので注意が必要です。もともとはホストサーバーとしてQZDAINITが動ける環境、つまりQSERVERが動いていてQZDAINITに関する記述を持っているというのが、スペックとしての前提です。
[Q].ODBCドライバーマネージャーを起動すると、あるはずのデータソースが全て無いのですが?
[A].何かエディターでODBC.INIを開いていませんか。ドライバーマネージャーは結局最後はODBC.INIを更新したいので、ある種のエディターでODBC.INIを先に開いておくとロックによってODBC.INIを参照できないため、データソースがなにがあるか分からない場合があります。経験ではライトはそういったことを起こします。メモ帳は大丈夫です。
[Q]AS/400のODBCレベルを教えてください。
[A].API適合は拡張レベル1、SQL適合は最小SQLです。
[Q].AS/400でストアードプロシージャはどのようにCALLされますか?
[A].AS/400においてODBCはあくまでも単一のジョブであるQZDAINIT(本来は)がお相手をしますから、当然そのなかでCALLされます。新しくジョブが生成されるわけではありません。新しいジョブが必要ならばSBMJOBを行うプログラムをCALLしなければいけません。
[Q].QZDAINITを実行しているユーザーはWRKACTJOBではQUSERですが?
[A].QZDAINITはジョブ生成後にユーザー権限を借用しますから、WRKACTJOBだけでは見えません。該当のジョブにオプション5を入れてDSPJOBにして10でDSPJOBLOGにしてF10で詳細表示にするとユーザー何々を実行中と表示されているはずです。
[Q].事前開始ジョブとはどのようなものですか
[A].ジョブ起動のオーバーヘッドをクライアントからの要求時点で発生させないために、あらかじめジョブを開始させ待機させておくための手法です。ADDPJEコマンドで指定します。
[Q].同じSQLを実行すると2回目以降のほうが早いのはなぜですか?
[A].SQLFreeStmtのfOptionにSQL_DROPを指定してループさせるとODPを離さないので2回目以降はパフォーマンスが上がります。
[Q].SQLパッケージはどのタイミングで作成されますか?
[A].SQLPrepareまたはSQLExecDirect発行時にExtendedDynamicが使用可能でPackageXXXXステートメントの3つの数字のうちの1番目が2ならば作成され、アクセスプランが保管されます。
[Q].SQLパッケージと間接実行とのからみがよくわかりません。
[A].からみはまったくありません。直接実行であっても間接実行であっても、ExtendedDynamicが使用可能でPackageXXXXステートメントの3つの数字のうちの1番目が2ならば、新しいアクセスプランはSQLパッケージに保管されます。AS/400は保管したアクセスプランに18桁の英数字からなるステートメントネームを割り当て、それをドライバーに返します。それにより、ドライバーは同一SQLであれば、ステートメントネームによりアクセスプラン実行依頼がだせる訳です。SQLパッケージに保管できない環境の場合、アクセスプランは間接実行に限り、ステートメントハンドル解放まで一時領域に保管され、ステートメントハンドル解放で消滅します。ただし本当にスペック通りの動きをしているのかどうも疑問もありますが。
[Q].フロントエンドアプリケーションによって見えないファイルがあるって本当?
[A].本当です。たとえばCCSIDという名前でCRTPFしてみましょう。それをODBC経由で照会しようとすると、データベースアクセスやExcelでは照会できません。しかしAccessでは照会できます。これはCCSIDというワードが予約語だからAS/400がはねているのですが、Accessはその制限を受けません。逆にいうとフロントエンドアプリケーションによってSQLの投げ方が異なるということが言えます。実際に使うにあたっては注意が必要でしょう。
[Q].SOCKETでODBCが動きません。
[A].SOCKETのデーモンが動いていないのではありませんか。QSERVERのなかにQZDASRVSDというバッチジョブがなければいけません。STRHOSTSVR *DATABASEで起動されます。逆に言うとSTRHOSTSVE *DATABASEがエラーになればデーモンは動けません。
[Q].VBでパラメーターマーカーがうまく渡りません。
[A].VBの場合(少なくとも4では)、パラメーターマーカーがSQL_C_CHARタイプの場合はSQLBindParameterしてSQLExecuteだけでは、 パラメーターマーカーはきちんと渡りません。渡すためには、SQLBindparameterでrgbValueに"0&"を指定し、pcbValueに"SQL_DATA_AT_EXEC"マクロを指定します。この場合はSQLExecuteによりSQL_NEED_DATA状態になりますので、SQLParamDataおよび SQLPutDataの組み合わせでパラメーターマーカーを渡します。詳細は拙著AS/400 DB Server ODBC for Windows95/NTテキストをご覧ください。
[Q].VBでブロック挿入ができません。
[A].VBの場合(少なくとも4では)、Dimで配列定義してもブロック挿入で渡せません。あくまでも1個の変数を定義し、 そこに要素となる変数を収めていきます。Arayを使用するとよいでしょう。また、SQL_C_CHARタイプの場合は要注意です。当方では数値フィールトではうまくいっています。
[Q].ユーザーDSN、システムDSN、ファイルDSNの違いは?
[A].ODBC3.0において、ユーザーDSNとはクライアント上のユーザーに認可されるデータソースです。つまりWindows95ならば、Windows95にログオンするユーザー毎に認可されるユーザーDSNがあります。システムDSNとは、そのクライアントにおいてユーザーにとらわれずに使用することができるデータソースです。前述の2つはあくまでもレジストリに書き込まれます。それに対し、ファイルDSNハは、あくまでもファイルとして保存されます。つまり、たとえば共有可能なサーバーにファイルDSNを置くことによって、各クライアントにデータソース定義をいちいち作成しなくとも使用することを可能にします。これと同じようなことがCA/400のAS/400オペレーションナビゲーター内のODBCで可能です。
[Q].ExcelやAccessでCOLHDGがとれません。
[A].COLHDGまたはLABELはSQLColAttributesで取得しますが、ExcelやAccessはSQLColAttributesを投げません。 このことは、ODBCトレースをとれば確認することができます。
[Q].最適化同時実行制御はどのように指定しますか?
[A].SQLSetStmtOptionをご覧ください。このほかにも様々なオプションを設定できます。
AS/400はIBM Corp.の商標です。
for more information, contact to Ken -yamaken- Yamasaki yamaken@po.iijnet.or.jpご意見ご感想をお寄せください。