「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:0
総数:2220
現在:1


レコードが0件のResultSetを判定できません

ページOpenOffice.org FAQの登録ページ
投稿者ひつじ
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2010-09-10 19:01:07 (金)
OSWindows XP
依存するページデータベースアクセス
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

ResultSetの中身が空かどうかを判定する方法として

   If Not IsNull(ResultSet) Then
       While ResultSet.next
           MsgBox ResultSet.getString(1)
       Wend
   End If

というものをよく見かけるのですが、私の環境ではこの判定方法でレコードが0件の場合 Nullとは判定されず、それでいてMsgBoxでの表示は何もされないという結果になります。

この判定がうまくいかないのは私だけなのでしょうか。


無題

ひつじ (2010-09-10 19:25:16 (金))

すみません。投稿が重複してしまいました。

内容が空でないかをチェック

M.Kamataki (2010-09-10 22:38:00 (金))

マクロの一部だけを拝見してもそこに原因がないかもしれません。したがって想像ですが、期待する動作としては、ResultSetが空になるまで、ResultSetにクエリーの結果を書き込むということですよね。間違っていたらすみません。

マクロで指定したクエリーは、Baseのクエリーから実行した際に何件かレコードが抽出されるのでしょうか。あるいはマクロで指定するクエリーに間違いがないでしょうか。ダブルクォーテーションのエスケープとか、意外に間違いやすいのでチェックしてみてください。

内容が入っていれば正常に動作します

ひつじ (2010-09-11 09:19:45 (土))

ご回答いただきありがとうございます。M.Kamatakiさんが想像されている使用法とは違うのですが、今回お聞きしたいのは最初に例に挙げたようなサンプル(依存するページとしてリンクした先の「テーブルからのデータの取得」という部分に詳しいサンプルが載っています)のif文が正しく動作しないという問題についてです。

このサンプルの想定している処理の流れとしては ResultSet の内容が空だった場合はif文の中の処理をやらずに終わるということになると思うのですが、私の環境ではif文の中に一旦入ってみるけど何も表示せずに終わるという流れになってしまいます。

最初に例に挙げたサンプルをちょっとだけいじって説明させていただくと

   If Not IsNull(ResultSet) Then
       MsgBox "a"    
       While ResultSet.next
           MsgBox ResultSet.getString(1)
       Wend
   Else
       MsgBox "b"
   End If


を実行すると、内容が空の ResultSet だった場合には MsgBox "a" が表示され、内容のある ResultSet の場合には "a" とレコードの行数分 ResultSet.getString(1) が表示されるといった感じで、どうがんばっても MsgBox "b" が表示されないのです。中身が空のはずの ResultSet なのに Null ではない、と判定されていることに納得がいかないので今回質問させていただきました。

誤解だと思います

ike@九州 (2010-09-11 10:15:43 (土))

IsNull ではレコード 0 件の判定はできません。
オブジェクトが取得できたかどうかの判定ではないでしょうか

レコードが在るかどうかは
ResultSet.next の戻り値が True を返したときだけです。

なので、レコードが 0 件の場合
最初の ResultSet.next の戻り値が False になります

それであれば納得できるのですが

ひつじ (2010-09-11 10:47:29 (土))

ike@九州 さん。ありがとうございます。
私がサンプルとして挙げたif文は ResultSet が空かどうかの判定をするものでは無かったということですね。それだと納得いきます。

ただ依存するページとしてリンクを張った先の説明で、

「次にこの Statement オブジェクトに対して executeQuery を実施して、その結果を ResultSet に格納しています。こうして得られた ResultSet については、その内容が空でないかをチェックした後ループに入り、個々のレコード情報を取り出します。」

と載っているのですが、そもそも参照したサイトにあるif文自体が無駄なコードになっているということになるんでしょうか。ここも私の理解力が足りないだけなのかな・・・。

executeQuery の返り値

はにゃ? (2010-09-11 11:41:29 (土))

IDL リファレンスを参照してみてください。
executeQuery によると、返り値は "never NULL" となっています。null になることはないので If 分は不要です。クエリする SQL 文が間違っていたときには例外が送出されてそのメソッドの返り値は受け取れません。

「ResultSet については、その内容が空でないかをチェック」についてですが、これは変数が値をもっているかどうかを判定するという意味で書いているのだと思います。英語の原文では "The program now checks whether the ResultSet actually exists and ..." です。

納得しました

ひつじ (2010-09-11 15:07:31 (土))

はにゃ?さん、ありがとうございます。

IDL リファレンスにははっきりと答えが書いてあるのですね。私はまだリファレンスの活用方法がよくわからないので参照先を教えていただき助かりました。

ResultSet のレコードが0件かどうか知りたい場合は別の条件で調べなければならないということで納得できました。それにしてもあのサンプルコードと日本語訳を読んで ResultSet が null ならレコードが空なんだろうと誤解してしまった人は私だけじゃないはず・・・。

また何かわからないことがあればこちらでお聞きすると思いますのでよろしくお願いします。

とりあえず完了

M.Kamataki (2010-09-12 11:45:56 (日))

「完了」にします。

お名前:
題名: