- ベストアンサー
ADOでNullフィールドの抽出
VB6.0+ADO2.7で、mdbファイルを扱っています。 .filterプロパティを使ってabcフィールドの値がnullまたは空のテーブルを抽出したく recordset.filter="abc= null or abc=''" としました。この場合は問題ないのですが、更にdefフィールドの条件を追加し recordset.filter="(abc= null or abc='') AND def= 'xyz'" としたところ 「実行時エラー3001 引数が間違った型、許容範囲外、または競合しています。」 というエラーが発生してしまいます。 また、 recordset.filter="abc= null AND def= 'xyz'" 或いは recordset.filter="abc='' AND def= 'xyz'" では問題ありません。 何が悪いのでしょうか? よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpado260/htm/mdprofilter.asp >次のように、OR で句を結合してできた句のグループを、AND を使ってさらに別の句と結合することはできません。 >(LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John' こちらの情報によると、ダメみたいですね。 Filter プロパティは制約が多いみたいで、where句のように自由に条件は書けないみたいですね。 > Null を使うことはできません。 さらに、こういう記述もあります。 SQL文のwhere句を利用した方が良いかも知れませんね。
その他の回答 (2)
最近は VB.NET + Oracle DataProvider/ADO.NET の環境での開発がメインなので、Old-VB + Old-ADO のやり方を随分忘れてしまってますが。 カラム abc ってのは、String型ですかね。 であれば、単純に recordset.filter="( CStr( abc ) IS NULL AND CStr( def ) = 'xyz' " ってな条件式に簡略化できるのでは? 要は、カラム abc に対して、Oracle で言う所の NVL() を施しておいて、それに対して NULL なレコードを抽出してね、ってことです。
- temtecomai2
- ベストアンサー率61% (656/1071)
.filter = "(abc = null OR def = 'xyz') AND (abc = '' OR def = 'xyz')" みたいに均してみるとか。
お礼
temtecomai2様 回答ありがとうございます。 アドバイスの通りしたところ、エラーな無くなりました。 AND条件とOR条件が混在する場合は、このように記述する決まりなのでしょうか?
お礼
venzou様 回答ありがとうございます。 msdnのサイトは大変参考になりました。 Filter プロパティは手軽なので、つい使ってしまうのですが、おっしゃる通り複雑なことをする場合は、SQLの方が良いのでしょうね。