2012年10月9日火曜日

テーブルアダプタの検索クエリにパラメータを渡すときの注意

VB.NET(VS2010)でテーブルの検索処理をするので、テーブルアダプタに検索クエリを作成、フォームで入力された値をキーにして検索するというごく普通の処理を作成。文字列の部分一致で検索させたかったので、入力値の前後にワイルドカードの % をつけてLIKE検索としました。すると完全一致のとき検索に失敗……あるはずのデータにヒットしない。よく調べてみると、検索対象のフィールド長より2文字少ない長さまでは部分一致検索できてるのが、それより長くなると失敗している。

検索対象の文字列フィールド Hogehoge の長さ:16
検索キーの入力欄(テキストボックス)のMax長さ:16

のとき、入力欄に1~14文字入力しているときはうまくヒットするんだけど、15~16文字だと失敗。
前後につけた % の2文字分というのがなんとなくあやしいとはあたりがつきましたが、さてそれってどこを直せば……。

と、先週末ハマっていたのですが、休み明けの今日、データセットのソース(~designer.vb)をゆっくり見てみると、クエリの定義のところに引数(@~)の長さ定義とかもあるのに気がつきました。ソースを直接直すのは危険なので、デザイナのどこかに設定箇所があるはず……と探して、ありました。テーブルアダプタのクエリを選択して、プロパティの Parameters のコレクションを展開すると、@引数の一覧が表示されます。当該パラメータの Size で2桁分増やしてやればOK。
例でいうと @hogehoge とかの Size が 16 になってるのを 18 にしてやる。

これってフィールド長いっぱいの検索キーを使用するときには常に起こりうる現象なんですが、そもそも入力したキーの前後に % つけてLIKE検索するというのがおかしいというか一般的でないのかな? 入力欄にワイルドカードとか含めた正規表現の記法で書いてもらえば(入力欄の文字数Maxがフィールド長と同じならば)問題ないんでしょうが、入力する人に正規表現覚えてもらわなきゃならないというのもなんかなーと思い……まぁ % (あるいは *) のワイルドカードぐらい覚えてもらってもいいかもですが。

0 件のコメント: