* レコードが0件のResultSetを判定できません [#o7580298]
 |RIGHT:|LEFT:|c
 |~ページ|[[OpenOffice.org FAQの登録ページ]]|
 |~投稿者|ひつじ|
 |~分類|#listbox3(Q&A,faq03,class)|
 |~優先順位|#listbox3(低,faq03,priority)|
 |~状態|#listbox3(完了,faq03,state)|
 |~カテゴリー|#listbox3(Base データベース,faq03,category)|
 |~投稿日|2010-09-10 19:01:07 (金)|
 |~OS|Windows XP|
 |~依存するページ|[[データベースアクセス>http://wiki.services.openoffice.org/wiki/JA/Documentation/BASIC_Guide/Database_Access]]|
 |~バージョン|#listbox3(3.2.1,faq03,version)|
 
 //////////バグ対策(以降マッチさせない)
 
 ** メッセージ [#e9224a54]
 |LEFT:|c
 |回答ページでは行末に「~」を付加する必要はありません|
 ResultSetの中身が空かどうかを判定する方法として
 
     If Not IsNull(ResultSet) Then
         While ResultSet.next
             MsgBox ResultSet.getString(1)
         Wend
     End If
 
 というものをよく見かけるのですが、私の環境ではこの判定方法でレコードが0件の場合
 Nullとは判定されず、それでいてMsgBoxでの表示は何もされないという結果になります。
 
 この判定がうまくいかないのは私だけなのでしょうか。
 
 ----
 ***無題 [#r7ccb125]
 >ひつじ (2010-09-10 19:25:16 (金))~
 ~
 すみません。投稿が重複してしまいました。~
 
 //
 ***内容が空でないかをチェック [#re9cb0d0]
 >M.Kamataki (2010-09-10 22:38:00 (金))~
 ~
 マクロの一部だけを拝見してもそこに原因がないかもしれません。したがって想像ですが、期待する動作としては、ResultSetが空になるまで、ResultSetにクエリーの結果を書き込むということですよね。間違っていたらすみません。~
 ~
 マクロで指定したクエリーは、Baseのクエリーから実行した際に何件かレコードが抽出されるのでしょうか。あるいはマクロで指定するクエリーに間違いがないでしょうか。ダブルクォーテーションのエスケープとか、意外に間違いやすいのでチェックしてみてください。~
 
 //
 ***内容が入っていれば正常に動作します [#u20c8352]
 >ひつじ (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 ではない、と判定されていることに納得がいかないので今回質問させていただきました。~
 
 //
 ***誤解だと思います [#oae05c84]
 >ike@九州 (2010-09-11 10:15:43 (土))~
 ~
 IsNull ではレコード 0 件の判定はできません。~
 オブジェクトが取得できたかどうかの判定ではないでしょうか~
 ~
 レコードが在るかどうかは~
 ResultSet.next の戻り値が True を返したときだけです。~
 ~
 なので、レコードが 0 件の場合~
 最初の ResultSet.next の戻り値が False になります~
 
 //
 ***それであれば納得できるのですが [#p92c5eaf]
 >ひつじ (2010-09-11 10:47:29 (土))~
 ~
 ike@九州 さん。ありがとうございます。~
 私がサンプルとして挙げたif文は ResultSet が空かどうかの判定をするものでは無かったということですね。それだと納得いきます。~
 ~
 ただ依存するページとしてリンクを張った先の説明で、~
 ~
 「次にこの Statement オブジェクトに対して executeQuery を実施して、その結果を ResultSet に格納しています。こうして得られた ResultSet については、その内容が空でないかをチェックした後ループに入り、個々のレコード情報を取り出します。」~
 ~
 と載っているのですが、そもそも参照したサイトにあるif文自体が無駄なコードになっているということになるんでしょうか。ここも私の理解力が足りないだけなのかな・・・。~
 
 //
 ***executeQuery の返り値 [#b7c767c4]
 >はにゃ? (2010-09-11 11:41:29 (土))~
 ~
 IDL リファレンスを参照してみてください。~
 [[executeQuery>http://api.openoffice.org/docs/common/ref/com/sun/star/sdbc/XStatement.html#executeQuery]] によると、返り値は "never NULL" となっています。null になることはないので If 分は不要です。クエリする SQL 文が間違っていたときには例外が送出されてそのメソッドの返り値は受け取れません。~
 ~
 「ResultSet については、その内容が空でないかをチェック」についてですが、これは変数が値をもっているかどうかを判定するという意味で書いているのだと思います。英語の原文では "The program now checks whether the ResultSet actually exists and ..." です。~
 
 //
 ***納得しました [#hddd2719]
 >ひつじ (2010-09-11 15:07:31 (土))~
 ~
 はにゃ?さん、ありがとうございます。~
 ~
 IDL リファレンスにははっきりと答えが書いてあるのですね。私はまだリファレンスの活用方法がよくわからないので参照先を教えていただき助かりました。~
 ~
 ResultSet のレコードが0件かどうか知りたい場合は別の条件で調べなければならないということで納得できました。それにしてもあのサンプルコードと日本語訳を読んで ResultSet が null ならレコードが空なんだろうと誤解してしまった人は私だけじゃないはず・・・。~
 ~
 また何かわからないことがあればこちらでお聞きすると思いますのでよろしくお願いします。~
 
 //
 ***とりあえず完了 [#d28b8d7e]
 >M.Kamataki (2010-09-12 11:45:56 (日))~
 ~
 「完了」にします。~
 
 //
 #article