- PR -

BindingSourceのFilterについて

1
投稿者投稿内容
kibayasi
会議室デビュー日: 2007/04/04
投稿数: 3
投稿日時: 2007-04-04 10:49
毎度お世話になっております。

OS:WindowsXP
DB:SQLServer2005ExpressEdition
VS:VS2005Professional(評価版)
言語:VisualBasic

当方データベースプログラミングを練習しているところなんですが、
BindingSourceのFilterでExceptionが出て、その理由がわからず困っています。

TestTableというテーブルのField1(varchar型)があった場合

Me.TestTableBindingSource.Filter = "Field1 LIKE 'A%0%'"

とすると、Exceptionが発生します。

Exceptionの内容は、
'System.Data.EvaluateException' の初回例外が System.Data.dll で発生しました。
Like 演算子のエラー : 文字列パターン 'A%0%' が無効です。
と出て、どうやら検索ワードの間に「%」を入れると出るようなんですが、
何か対処法なり理由なりご存知の方いらっしゃいますでしょうか?

SQLServer側のクエリではいけるので、
BindingSource側が何かやってるようなのですけど。
たとえば、「%」の部分が「*」でもFilterとして機能してるようですし。

よろしくお願いします。





[ メッセージ編集済み 編集者: kibayasi 編集日時 2007-04-04 10:50 ]
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-04-04 11:03
BindingSource の Filter プロパティは使ったことがありませんが、たぶ
ん DataView の RowFilter プロパティと同じ扱いで良いと思われます。
その場合、詳細は DataColumn の Expression プロパティを見ろと書
かれているので、それを少し参照してみます。
DataColumn.Expression プロパティ (microsoft.com)

その中に以下のような記述があります。

引用:

ワイルドカード文字は文字列の途中に使用できません。たとえば、"te*xt" とは表記できません。


ということなので、"Field1 LIKE 'A%0%'" で Exception が発生するの
は仕方がないことなのかもしれません。

ちなみに

引用:

SQLServer側のクエリではいけるので、
BindingSource側が何かやってるようなのですけど。


SQL Server 側のクエリにおける LIKE と BindingSource の Filter
プロパティは全くの別物です。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-04-04 11:25
BindingSource.Filter の文字列はSQLのWHERE句と似たような文法が使用されることが多いですが、
実際には使用できる表現は、既定のリスト(IBindingListView)のFilter プロパティが
どのように実装されているかによります。

この場合はデザイナで生成されたデータセットをお使いなのだと思いますので、
BindingSource の既定のリストは DataView になります。
DataView.RowFilter が IBindingListView.Filter を実装しているのでしょうね。
DataView.RowFilter を見ると「詳細については、DataColumn クラスの Expression プロパティの
トピックを参照してください。」とあります。
そこで DataColumn.Expressionを見ると使用できる表現が書いてありますね。

DataColumn.Expression より引用

引用:

ワイルドカードを使用できるのは、パターンの先頭と末尾、パターンの末尾、またはパターンの先頭です。
ワイルドカード文字は文字列の途中に使用できません。たとえば、"te*xt" とは表記できません。



って・・・ぽぴ玉子さんに先越されましたけど、一応投稿しときます。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-04-04 11:38
本題と全然関係ない話題ですが。

引用:

って・・・ぽぴ玉子さんに先越されましたけど、一応投稿しときます。


実はエイプリルフール用にハンドルネームを「ぽぴ玉子」に変えていたこと
をこれで思い出しました orz
…こっそり元に戻しました。KIさんどうもありがとうございます。

恥ずかしくて恥ずかしくて穴があったら埋めたいです。アラーの神よ、これ
以上ワタシをもてあそぶのはやめてください(自業自得です)。

# 謝辞を入れ忘れたので修正
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。

[ メッセージ編集済み 編集者: ぽぴ王子 編集日時 2007-04-04 11:51 ]
kibayasi
会議室デビュー日: 2007/04/04
投稿数: 3
投稿日時: 2007-04-04 11:52
ぽぴ玉子さん・KIさん
早速のご回答ありがとうございます。

そうですか、元々の仕様なんですね。
それは仕方がない?ですねえ。。
とりあえず、ExceptionをCatchしてスルーしようかと思いますが、
同じような検索(フィルタ)をしようと思った場合、
TableAdapterにクエリでも作ってデータを取り直すんでしょうか?


KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-04-04 12:20
引用:

ExceptionをCatchしてスルーしようかと思いますが


どういう意味ですか?

引用:

同じような検索(フィルタ)をしようと思った場合、
TableAdapterにクエリでも作ってデータを取り直すんでしょうか?


クエリを使うということは、DBから取得することになりますよね。
一方で BindingSource.Filter はメモリ上に読み込んだ DataTable から
条件を満たすレコードを抽出しますので、全く意味合いは異なります。

フィルタ処理なら、先に挙げた DataColumn.Expression プロパティの説明によると
LEN とか SUBSTRING 関数もフィルタ式内で使えるみたいですから、
上手く表現を工夫すれば出来そうな気がします。

>ぽぴ王子さん
いつもお世話になってます。
全く気がつかずに、投稿者名のとこからコピペしてました^^;
kibayasi
会議室デビュー日: 2007/04/04
投稿数: 3
投稿日時: 2007-04-04 12:54
お世話になっております。m(_ _)m

引用:

引用:

ExceptionをCatchしてスルーしようかと思いますが


どういう意味ですか?


言葉が足りなくて申し訳ありませんでした。
今、インクリメンタルサーチをしようとしているのですが、
入力時にフィルタ文を作成して、BindingSource.Filterに設定しています。
そこで、Exceptionがあがったら、
エラーメッセージを出すか、または処理しない方向でいいかなと思いまして。。

引用:

引用:

同じような検索(フィルタ)をしようと思った場合、
TableAdapterにクエリでも作ってデータを取り直すんでしょうか?


クエリを使うということは、DBから取得することになりますよね。
一方で BindingSource.Filter はメモリ上に読み込んだ DataTable から
条件を満たすレコードを抽出しますので、全く意味合いは異なります。

フィルタ処理なら、先に挙げた DataColumn.Expression プロパティの説明によると
LEN とか SUBSTRING 関数もフィルタ式内で使えるみたいですから、
上手く表現を工夫すれば出来そうな気がします。



Substring関数ですか。。
たとえば、"A%0"の場合、
'A%'と'%0'に分けて、ANDでも取るってことなんですかね。。
うーむ、なんだか、手ごわそうですね。。



[ メッセージ編集済み 編集者: kibayasi 編集日時 2007-04-04 12:55 ]
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-04-04 14:07
引用:

kibayasiさんの書き込み (2007-04-04 12:54) より:
今、インクリメンタルサーチをしようとしているのですが、
入力時にフィルタ文を作成して、BindingSource.Filterに設定しています。
そこで、Exceptionがあがったら、
エラーメッセージを出すか、または処理しない方向でいいかなと思いまして。。


ユーザー入力を Filter プロパティにあてるつもりだったのですね。
でしたら、そのまま Filter プロパティに設定するのではなく、
コードで正しいフィルタ式への変換を行ってから設定するほうがよいと思います。
そうすればExceptionをキャッチする必要もなくなるはずです。

よく考えたらSubStringなど使わなくても

Field1 Like 'A%0%' → Field1 Like 'A%' AND Field1 Like '%0%'

みたいに分割はできますね。
ただ、'A%B%C%' とかになると私にはいい方法が思いつきません。
こういう検索をサポートしなければならないなら RowFilter では難しいかも知れません。
1

スキルアップ/キャリアアップ(JOB@IT)