- - PR -
BindingSourceのFilterについて
1
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||||||||||||||
|
投稿日時: 2007-04-04 11:03
BindingSource の Filter プロパティは使ったことがありませんが、たぶ
ん DataView の RowFilter プロパティと同じ扱いで良いと思われます。 その場合、詳細は DataColumn の Expression プロパティを見ろと書 かれているので、それを少し参照してみます。 DataColumn.Expression プロパティ (microsoft.com) その中に以下のような記述があります。
ということなので、"Field1 LIKE 'A%0%'" で Exception が発生するの は仕方がないことなのかもしれません。 ちなみに
SQL Server 側のクエリにおける LIKE と BindingSource の Filter プロパティは全くの別物です。 _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||||||||||||||
|
投稿日時: 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 より引用
って・・・ぽぴ玉子さんに先越されましたけど、一応投稿しときます。 | ||||||||||||||||
|
投稿日時: 2007-04-04 11:38
本題と全然関係ない話題ですが。
実はエイプリルフール用にハンドルネームを「ぽぴ玉子」に変えていたこと をこれで思い出しました orz …こっそり元に戻しました。KIさんどうもありがとうございます。 恥ずかしくて恥ずかしくて穴があったら埋めたいです。アラーの神よ、これ 以上ワタシをもてあそぶのはやめてください(自業自得です)。 # 謝辞を入れ忘れたので修正 _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 [ メッセージ編集済み 編集者: ぽぴ王子 編集日時 2007-04-04 11:51 ] | ||||||||||||||||
|
投稿日時: 2007-04-04 11:52
ぽぴ玉子さん・KIさん
早速のご回答ありがとうございます。 そうですか、元々の仕様なんですね。 それは仕方がない?ですねえ。。 とりあえず、ExceptionをCatchしてスルーしようかと思いますが、 同じような検索(フィルタ)をしようと思った場合、 TableAdapterにクエリでも作ってデータを取り直すんでしょうか? | ||||||||||||||||
|
投稿日時: 2007-04-04 12:20
どういう意味ですか?
クエリを使うということは、DBから取得することになりますよね。 一方で BindingSource.Filter はメモリ上に読み込んだ DataTable から 条件を満たすレコードを抽出しますので、全く意味合いは異なります。 フィルタ処理なら、先に挙げた DataColumn.Expression プロパティの説明によると LEN とか SUBSTRING 関数もフィルタ式内で使えるみたいですから、 上手く表現を工夫すれば出来そうな気がします。 >ぽぴ王子さん いつもお世話になってます。 全く気がつかずに、投稿者名のとこからコピペしてました^^; | ||||||||||||||||
|
投稿日時: 2007-04-04 12:54
お世話になっております。m(_ _)m
言葉が足りなくて申し訳ありませんでした。 今、インクリメンタルサーチをしようとしているのですが、 入力時にフィルタ文を作成して、BindingSource.Filterに設定しています。 そこで、Exceptionがあがったら、 エラーメッセージを出すか、または処理しない方向でいいかなと思いまして。。
Substring関数ですか。。 たとえば、"A%0"の場合、 'A%'と'%0'に分けて、ANDでも取るってことなんですかね。。 うーむ、なんだか、手ごわそうですね。。 [ メッセージ編集済み 編集者: kibayasi 編集日時 2007-04-04 12:55 ] | ||||||||||||||||
|
投稿日時: 2007-04-04 14:07
ユーザー入力を Filter プロパティにあてるつもりだったのですね。 でしたら、そのまま Filter プロパティに設定するのではなく、 コードで正しいフィルタ式への変換を行ってから設定するほうがよいと思います。 そうすればExceptionをキャッチする必要もなくなるはずです。 よく考えたらSubStringなど使わなくても Field1 Like 'A%0%' → Field1 Like 'A%' AND Field1 Like '%0%' みたいに分割はできますね。 ただ、'A%B%C%' とかになると私にはいい方法が思いつきません。 こういう検索をサポートしなければならないなら RowFilter では難しいかも知れません。 |
1