トップ回答者
BindingSource.Filterプロパティについて

質問
回答
-
こんにちは。
試してみたところ再現しました。
以下を参考にIN句に変更したところ発生しなくなりました。http://stackoverflow.com/questions/7240292/bindingsource-filter-maximum-length
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim hoge As New StringBuilder() 'For i As Integer = 0 To 1800 ' If hoge.Length <> 0 Then ' hoge.Append(" OR ") ' End If ' hoge.Append(String.Format(" test = {0} ", i)) 'Next For i As Integer = 0 To 1800 If hoge.Length = 0 Then hoge.Append(" test in ( ") Else hoge.Append(" , ") End If hoge.Append(i) Next hoge.Append(" ) ") BindingSource1.Filter = hoge.ToString() End Sub
たしかに、見当たらないですね。探し中です。
- 回答としてマーク KBN.Y 2015年12月25日 5:26
-
BindingSource::Filter自体は、BindingSource::DataSourceが持つFilterに対して渡しているだけなので直接的な原因ではありません。
たとえばDataView(DataTableをBindingSource::DataSourceにしたときに暗黙にソースとして扱われるオブジェクト)のRowFilterプロパティ(BindingSource::Filterはこのプロパティに設定されます)は、解析に再帰を使っているらしく、長ったらしいクエリを設定するとStackOverflowExceptionになります。
クエリを見直すとか、Filterを使わないとか、そういう方向での回避策を考える必要がありますね。
- 回答としてマーク KBN.Y 2015年12月25日 5:26
すべての返信
-
こんにちは。
試してみたところ再現しました。
以下を参考にIN句に変更したところ発生しなくなりました。http://stackoverflow.com/questions/7240292/bindingsource-filter-maximum-length
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim hoge As New StringBuilder() 'For i As Integer = 0 To 1800 ' If hoge.Length <> 0 Then ' hoge.Append(" OR ") ' End If ' hoge.Append(String.Format(" test = {0} ", i)) 'Next For i As Integer = 0 To 1800 If hoge.Length = 0 Then hoge.Append(" test in ( ") Else hoge.Append(" , ") End If hoge.Append(i) Next hoge.Append(" ) ") BindingSource1.Filter = hoge.ToString() End Sub
たしかに、見当たらないですね。探し中です。
- 回答としてマーク KBN.Y 2015年12月25日 5:26
-
BindingSource::Filter自体は、BindingSource::DataSourceが持つFilterに対して渡しているだけなので直接的な原因ではありません。
たとえばDataView(DataTableをBindingSource::DataSourceにしたときに暗黙にソースとして扱われるオブジェクト)のRowFilterプロパティ(BindingSource::Filterはこのプロパティに設定されます)は、解析に再帰を使っているらしく、長ったらしいクエリを設定するとStackOverflowExceptionになります。
クエリを見直すとか、Filterを使わないとか、そういう方向での回避策を考える必要がありますね。
- 回答としてマーク KBN.Y 2015年12月25日 5:26
-
KBN.Y さま よろしく。
恐らく、何かの処理をしながら抽出を積み重ねているのでは?と思います。
いっその事、その処理中に、別の指標(boolean 型で True/False)を付けるか、別テーブルに一意コードを切り出すか、
の方が集合で扱えるので宜しいのではないでしょうか?。
抽象的なコメントで申し訳ないのですが。
メンテナンスもデバッグもきっと楽になりますよ。- 編集済み ShiroYuki_Mot 2015年12月21日 13:59 お名前誤字訂正 失礼しました
-
フォーラム オペレーターの星 睦美です。KBN.Y さん、投稿ありがとうございます。
フォーラムのユーザーからの返信があります。内容を確認いただいて更に詳しく知りたい点がありましたら返信いただければと思います。回答の励みになりますので参考になった回答には投稿者からの[回答としてマーク] をお願いします。
・フォーラムのヘルプ
フォーラム オペレーター 星 睦美 - MSDN Community Support
-
そしてExistsで早くなるのはインデックスが絡んだ話かと思ってましたが、今回のケースでもパフォーマンスがよくなるのですね。
念のために書いておきますね。
Existsが必ずINよりも速くなるとは限りません。どちらもインデックスが使えるときは使われますので、インデックスが必ず絡むわけでもありません。ExistsとINの違いについての記述は多くのページで見つかりますので私が詳しくここで書く必要はありませんが、いずれにしてもオプティマイザーの動作や実行プランも見ながら最終的には判断することになると思います。★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
-