お仕事的なもので開発をやってて、現在進行形で詰まってるお話。
TableAdapterを使ってDBにアクセスして、もらってきた情報をDataGridViewに突っ込む。
SELECT カラム, カラム, カラム FROM テーブル
という構成でデザイナからメソッドを作っておけば、とりあえず全件表示はできた。
問題はここから。
コントロールとして配置しているテキストボックスを利用して、表示する項目に条件をかけたい。
たとえば、各レコードのとあるカラムに「xxx」という文字が含まれているもののみ表示、とか。
入力される文字は様々だから、@~、と書いて引数としてテキストボックスの中身をもらってくる。
WHERE (カラム LIKE '%' + @引数 + '%')
と付け足せば問題はない。指定したい条件が増えても、ANDを使って後ろに書き足していけばいい。
…ように思ってたんだけど、どうやら想像通りの動きをしてくれない。
どうやらDBの一部カラムではNULLが許容されてて、絞り込むときにうまく絞り込んでくれない。
たとえば、DBのUserというテーブルにカラムが3つあって、それぞれ
ID Name Address
だとする。テキストボックスも3つ用意してあって、それぞれのカラムに条件を指定できるようにしたい。絞り込むときは部分一致で検索していくようにしたいので、TableAdapterで作るSQL文は、
SELECT ID, Name, Address
FROM User
WHERE (ID LIKE '%' + @ID + '%')
AND (Name LIKE '%' + @Name + '%')
AND (Address LIKE '%' + @Address + '%')
→
としておき、
FillBySearch
という名前でメソッドにしておく。
プログラムの方から、
// ボタンクリックイベント内
this.tableAdapter.FillBySearch(this.dataSet.dataTable, this.textBox_ID.Text, this.textBox_Name.Text, this.textBox_Address.Text);
と書いて呼び出す。
こうすると、入力されている項目に対しては部分一致で絞り込みをかけることができ、
入力がなければワイルドカードで絞り込みを行うので、結果的には絞り込みせずに表示を行える。
ところが、AddressカラムにはNullが許容されており、しかもわけのわからないことに全レコードのAddressカラムの値がNullなのだ。
これでは入力なしで絞り込んでも、一致をしなかったせいで全レコードが表示されなくなってしまう。大問題だ。
某所で助言を求めたところ、結局はテキストボックスに入力があるかどうかをif文で判定し、入力がある場合にその項目で検索を行う、というものがあった。
確かに思いつきはしたが、結局それだとプログラムの方から動的にWHERE句を弄る必要が出てくる。
// ボタンクリックイベント内
if (textBox_ID.Text != string.Empty)
// WHERE句にIDで絞り込む記述を追加
if (textBox_Name.Text != string.Empty)
// WHERE句にNameで絞り込む記述を追加
if (textBox_Address.Text != string.Empty)
// WHERE句にAddressで絞り込む記述を追加
ここまでは思いつくのだが、結局のところ上記のコメントの部分に相当する処理が全くわからない。
自分なりにいろいろ調べてはみたが、具体的な方法は分からずじまい。
なるべくファイルの追加等は避けたいので、ここで数時間ほど手が止まっている状態。
細かく具体的に手解きしてくださる方はいらっしゃいませんか…?
→解決。詳細はコメントにて。
ありがとうございました。