DOBON.NET DOBON.NETプログラミング掲示板過去ログ

【C#】DataViewのRowFilterにおけるLike演算子の制限

環境/言語:[環境:WindowsXP 言語:C#]
分類:[.NET]

初めて質問させていただきます「こーいち」と申します。
みなさんよろしくお願いいたします。

現在C#でプログラムを組んでいるのですが、
DataViewのRowFilterを使用しているロジックでエラーが発生してしまい、
解消できずに困っております。

内容はRowFilterを用いてフィルタリングを行う為に
フィルター条件に「"項目名 LIKE '*[*'"」を設定しようとしています。
すると下記のエラーが発生して設定が行えません。

{"Like 演算子のエラー : 文字列パターン '*[*' が無効です。" }
ここでは「[」の文字で部分一致による検索を行おうと試みています。

色々調べてみたのですが、解決方法が見つからず質問させていただきました。

以上宜しくお願いいたします。
■No18130に返信(こーいちさんの記事)

こんにちは。

> 色々調べてみたのですが、解決方法が見つからず質問させていただきました。

色 々 調 べ て み た
の部分を、どう調べたのか、何を調べたのか、を書かないと伝わりませんよね。
できる限り調べてわからなかったというのは伝わりますが、回答者がこーいちさんと
同じ方法で調べたとして、その結果を回答したときに「あ、それはもう調べました」と
言われたら、調べた時間が無駄になるわけです。
なので、できればここは詳しく書いていただけるとありがたいです。

それはそれとして。

RowFilter を使っているわけで、ということはまず一番最初に見るべきは MSDN の
RowFilter の項目ですよね。
http://msdn2.microsoft.com/ja-jp/library/system.data.dataview.rowfilter(VS.80).aspx
そこには
> 詳細については、DataColumn クラスの Expression プロパティのトピックを参照してください。
と書いてあるので、今度は Expression プロパティのヘルプを見てみます。
http://msdn2.microsoft.com/ja-jp/library/system.data.datacolumn.expression(VS.80).aspx
すると
> 次に示す文字は特殊文字であるため、これらの文字を列名に使用する場合は、次に説明するようにエスケープする必要があります。
とあります。
その中に今回使われている [ が入っていますね。
であればヘルプの記載どおりエスケープしてあげる必要があるとわかります。

あとはご自分で試行錯誤してみてください。
>ぽぴ王子さん
質問の内容に不備がありまして申し訳ありませんでした。

「色々」と言うのは、曖昧な表現でした。
以後気をつけます。

MSDNのヘルプに関してですが、完全に見落としていました。
本件は解決する事が出来ました。

大変ありがとうございます。
解決済み!
申し訳ないのですが再び質問させていただきます。

先日質問をさせていただき不明点は解決できたのですが、
新たに問題が発生してしまったので、質問させていただきます。

DataViewのRowFilterにて
「"項目名 LIKE '*[<]*'"」
を指定しても「>」でフィルタリングを行う事が出来ませんでした。

更に「"項目名 LIKE '*[']*'"」と指定すると
エラーが発生してしまいます。

何か解法の手がかりをご存知の方がいましたらご教授宜しくお願いいたします。
お世話になります。

ぽぴ王子さんの提示されている URL もそうですが、
"RowFilter エスケープ" 等で検索すればなんぼでも情報はでてきますよ。

■No18140に返信(こーいちさんの記事)
Dim dt As DataTable = New DataTable("test")
dt.Columns.Add("column1", GetType(String))

dt.Rows.Add(New String() {">>>"})
dt.Rows.Add(New String() {"<<<"}) ' 抽出される
dt.Rows.Add(New String() {"><>"}) ' 抽出される
dt.Rows.Add(New String() {"a[a"}) ' 抽出される
dt.Rows.Add(New String() {"a]a"})
dt.Rows.Add(New String() {"a'a"}) ' 抽出される
dt.Rows.Add(New String() {"b""b"})

Dim dv As DataView = dt.DefaultView
dv.RowFilter = "column1 LIKE '%<%' " & _
       "OR " & _
       "column1 LIKE '%[[]%'" & _
       "OR " & _
       "column1 LIKE '%''%'"
>なおこ(・∀・) さん
早速の回答ありがとうございます。

結果を言いますと、RowFilterにご指摘の内容を記述してみても
フィルタリングは行えませんでした。
サンプルプログラムでの確認は行っておりません(申し訳ありません)

どのような状況で動作させているかと申しますと。
フィルタリング項目の内容:\^~<>'"=+-/
の内容に対してフィルタリングを実行しようと試みています。
\^~=+-/をRowFilterに設定するとフィルタリングが有効になるのですが
<>'"をRowFilterに設定してもフィルタリングが行われていません。

下記のようにRowFilterに設定してみて試してみました。
フィルタリング×
RowFilter = "項目名 LIKE '%<%'"
RowFilter = "項目名 LIKE '%[<]%'"
フィルタリング○
RowFilter = "項目名 LIKE '%/%'"
RowFilter = "項目名 LIKE '%[/]%'"
となります。

インターネットで調査をしてみても「<」や「>」の記述はあまりないので
あまり意識しないでしようできるものと思っていたのではまってしまっています(涙)
自己解決しました。
ご協力いただいたみなさん本当にありがとうございました。

フィルタリングできなかった原因は、
HttpUtility.HtmlEncodeを用いて
エンコード処理をしていたものに対してフィルタリングを行っていたためでした。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板