3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ド素人なC#erがTableAdapterで作るWHERE句を動的に書き変えられないお話。

Last updated at Posted at 2015-02-24

お仕事的なもので開発をやってて、現在進行形で詰まってるお話。

TableAdapterを使ってDBにアクセスして、もらってきた情報をDataGridViewに突っ込む。
SELECT カラム, カラム, カラム  FROM テーブル
という構成でデザイナからメソッドを作っておけば、とりあえず全件表示はできた。

問題はここから。
コントロールとして配置しているテキストボックスを利用して、表示する項目に条件をかけたい。
たとえば、各レコードのとあるカラムに「xxx」という文字が含まれているもののみ表示、とか。
入力される文字は様々だから、@~、と書いて引数としてテキストボックスの中身をもらってくる。
WHERE (カラム LIKE '%' + @引数 + '%')
と付け足せば問題はない。指定したい条件が増えても、ANDを使って後ろに書き足していけばいい。

…ように思ってたんだけど、どうやら想像通りの動きをしてくれない。
どうやらDBの一部カラムではNULLが許容されてて、絞り込むときにうまく絞り込んでくれない。

たとえば、DBのUserというテーブルにカラムが3つあって、それぞれ
ID Name Address
だとする。テキストボックスも3つ用意してあって、それぞれのカラムに条件を指定できるようにしたい。絞り込むときは部分一致で検索していくようにしたいので、TableAdapterで作るSQL文は、

DataSetAdapter内、クエリの追加→構成
SELECT ID, Name, Address
  FROM User
  WHERE (ID LIKE '%' + @ID + '%')
    AND (Name LIKE '%' + @Name + '%')
    AND (Address LIKE '%' + @Address + '%')


としておき、
FillBySearch
という名前でメソッドにしておく。
プログラムの方から、

Form1.cs
// ボタンクリックイベント内
this.tableAdapter.FillBySearch(this.dataSet.dataTable, this.textBox_ID.Text, this.textBox_Name.Text, this.textBox_Address.Text);

と書いて呼び出す。

こうすると、入力されている項目に対しては部分一致で絞り込みをかけることができ、
入力がなければワイルドカードで絞り込みを行うので、結果的には絞り込みせずに表示を行える。

ところが、AddressカラムにはNullが許容されており、しかもわけのわからないことに全レコードのAddressカラムの値がNullなのだ。
これでは入力なしで絞り込んでも、一致をしなかったせいで全レコードが表示されなくなってしまう。大問題だ。

某所で助言を求めたところ、結局はテキストボックスに入力があるかどうかをif文で判定し、入力がある場合にその項目で検索を行う、というものがあった。
確かに思いつきはしたが、結局それだとプログラムの方から動的にWHERE句を弄る必要が出てくる。

Form1.cs
// ボタンクリックイベント内
if (textBox_ID.Text != string.Empty)
 // WHERE句にIDで絞り込む記述を追加
if (textBox_Name.Text != string.Empty)
 // WHERE句にNameで絞り込む記述を追加
if (textBox_Address.Text != string.Empty)
 // WHERE句にAddressで絞り込む記述を追加

ここまでは思いつくのだが、結局のところ上記のコメントの部分に相当する処理が全くわからない。
自分なりにいろいろ調べてはみたが、具体的な方法は分からずじまい。
なるべくファイルの追加等は避けたいので、ここで数時間ほど手が止まっている状態。

細かく具体的に手解きしてくださる方はいらっしゃいませんか…?

→解決。詳細はコメントにて。
ありがとうございました。

3
3
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?