DOBON.NET DOBON.NETプログラミング掲示板過去ログ

OpenRdoResultsetエラー

環境/言語:[WinXP Pro,VB6.0]
分類:[VB6以前]

[OS: WinXP Pro SP1]
[VB: VB6.0 SP6]
[RDO: MSRDO20.DLL]

いつも参考にさせて貰っています。

VBでSQLを作成し、DB2上のテーブルにアクセスし、
VB上にそのデータを表示する、という処理を行っています。

具体的には
set rdset = rdocn.OpenResultset(strSQL,rdOpenForwardOnly,rdConcurReadOnly)

という処理でrdsetに結果を入れようとしています
(rdset: rdoResultset
rdocn: rdoConnection
strSql: SQL文)

しかし、実行すると

エラー番号:40002
メッセージ:テキストで 指定された項目はありません

と表示され異常終了します。
ただしSQL、その他設定を一切変更せずに実行すると正常に動くときもあります。

【試したこと】
SQLをDB2で直接実行した場合は問題なく動きました。
SQL文を全て大文字、もしくは小文字に統一して処理を行っても
変化は認められませんでした。

【お尋ねしたいこと】
この現象の原因、回避策をお尋ねします。

現象が起きる条件がはっきりと確定できていない状態で
みなさんに質問するのは無茶というものですが。。。
なにか、解決の心当たりをご存知でしたらご教授願います
■No7256に返信(まんもさんの記事)
> [OS: WinXP Pro SP1]
> [VB: VB6.0 SP6]
> [RDO: MSRDO20.DLL]
>
> いつも参考にさせて貰っています。
>
> VBでSQLを作成し、DB2上のテーブルにアクセスし、
> VB上にそのデータを表示する、という処理を行っています。
>
> 具体的には
> set rdset = rdocn.OpenResultset(strSQL,rdOpenForwardOnly,rdConcurReadOnly)
>
> という処理でrdsetに結果を入れようとしています
> (rdset: rdoResultset
> rdocn: rdoConnection
> strSql: SQL文)
>
> しかし、実行すると
>
> エラー番号:40002
> メッセージ:テキストで 指定された項目はありません
>
> と表示され異常終了します。
> ただしSQL、その他設定を一切変更せずに実行すると正常に動くときもあります。
>
> 【試したこと】
> SQLをDB2で直接実行した場合は問題なく動きました。
> SQL文を全て大文字、もしくは小文字に統一して処理を行っても
> 変化は認められませんでした。
>
> 【お尋ねしたいこと】
> この現象の原因、回避策をお尋ねします。
>
> 現象が起きる条件がはっきりと確定できていない状態で
> みなさんに質問するのは無茶というものですが。。。
> なにか、解決の心当たりをご存知でしたらご教授願います

まんもさん、始めまして。
この質問では原因を究明する情報が少なすぎるので、なんともいえませんが、
1.rdocnの定義を先に行っていますか?…コネクションが生成されていない可能性がある。
2.ブレークポイントを使ってstrSQLの中身をコピーしてDB2で直接実行してみましたか?
う〜ん、エラーメッセージを見る限り、2番を試したら解るような気がしますが...
べがらぼさん、始めまして。
アドバイスありがとうございます。

> この質問では原因を究明する情報が少なすぎるので、なんともいえませんが、
> 1.rdocnの定義を先に行っていますか?…コネクションが生成されていない可能性がある。
> 2.ブレークポイントを使ってstrSQLの中身をコピーしてDB2で直接実行してみましたか?
> う〜ん、エラーメッセージを見る限り、2番を試したら解るような気がしますが...

説明不足で申し訳ありません。
処理の流れをもう少し詳しくご説明しますと

1. rdocnをrdoConnectionでパブリック宣言
2. rdsetをrdoResultSetで宣言
3. 関数fc_connectをcall
fc_connect処理
 1.Set rdocn = rdoEngine.rdoEnvironments(0).OpenConnection.(strDSN,rdDriverNoprompt,False,strconnect)
  を実行(strDSN,strconnectにはコネクション情報を代入)
4. 関数fc_getをrdsetを引数としてcall
fc_get処理
 1.SQLを作成
 2.set rdset = rdocn.Openresultset(SQL,rdOpenFowardOnly,ConcurReadOnly)
  を実行(ここでエラーが起きる場合があります;;)
5. rdsetを編集

という流れになってます。

べがらぼさんからご指摘頂いたSQLを直接実行を試して見ました。
エラーが起きた時、正常に終了した時、それぞれのSQLをDB2で直接実行してみましたが
どちらとも正常に実行されました。のでSQL自体の問題では無いのかも。。。

自分でも調べてみたところ

RDO1.0ではrdoResultsetオブジェクトに既に割り当てられている変数を
OpenResultsetメソッドを使って別のrdoResultsetオブジェクトに設定しても
既存のオブジェクトは開いたままでrdoResultsetsコレクションからも
削除されないが、RDO2.0では既存のrdoResultsetオブジェクトは閉じられ
rdoResultsetsコレクションからも削除される。

という記述がありました。
今回のエラーと関係あるのでしょうか?
■No7271に返信(まんもさんの記事)
> べがらぼさん、始めまして。
> アドバイスありがとうございます。
こんにちは。拘ってるみたいで嫌なのですが、ぺがらぼ(pegalabo)です。
詳細は、ttp://pegalabo.net/cgi/room/c-board.cgi?cmd=ntr;tree=163;id=chat
をごらんくださいませ。

さて、いろいろと試しているみたいなので、私が時々してしまうミスをあげますと、データベースの接続先が違う...という事はありませんか?
SQL文は確かにチェックしても問題が無い。でも、「指定された項目はありません」と怒られる...で、もしかしてと思い、データベースの接続先を調べて見たら...アララ違ってたorz
って事がありました。
複数のデータベースがあって、データコンバートシステムを作成していたので、複数の接続先を生成していたというオチがあった訳です。
  • 題名: Re[4]: OpenRdoResultsetエラー
  • 著者: まんも
  • 日時: 2004/11/10 17:49:04
  • ID: 7287
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
> こんにちは。拘ってるみたいで嫌なのですが、ぺがらぼ(pegalabo)です。
> 詳細は、ttp://pegalabo.net/cgi/room/c-board.cgi?cmd=ntr;tree=163;id=chat
> をごらんくださいませ。

あああっすいませんんんっっ 失礼いたしましたm(__)m
HP拝見させて頂きました。ネトゲ楽しみにしてますw

> さて、いろいろと試しているみたいなので、私が時々してしまうミスをあげますと、データベースの接続先が違う...という事はありませんか?
> SQL文は確かにチェックしても問題が無い。でも、「指定された項目はありません」と怒られる...で、もしかしてと思い、データベースの接続先を調べて見たら...アララ違ってたorz
> って事がありました。
> 複数のデータベースがあって、データコンバートシステムを作成していたので、複数の接続先を生成していたというオチがあった訳です。

アドバイスありがとうございます。
さっそく接続先を確認してましてみましたが、
成功する時もエラーが起きる時も接続先は同じでしたので問題なさそうです。

現在、発行するSQLを変えてエラーの発生条件を特定しようとしています。
いろいろ試してみた結果、日付指定の範囲を長く取ると
エラーが起きる確立が上がる。。。様な気がしますが
あんまり関係ないような気もします。
問題解決のアプローチを変えたほうがいいんでしょうか;;

DOBON.NET | プログラミング道 | プログラミング掲示板