QA@IT

VB2013 GridView Selectステートメントの構成について

7219 PV

はじめまして。Sasaoloと申します。

表題の件について質問です。
初歩的な質問で申し訳ございませんが、ご教示いただけると幸いです。

環境:Win8 Pro、Visual Studio 2013

①指定したい都道府県をDropDownListから選択し、②市区町村をTextBoxに入力し、ボタンを押すと①②の条件に合うデータベースの情報がGridViewに一覧表示されるようにしようと考えています。

[データソースの構成]-[Selectステートメントの構成]-[WHERE]で、「Where ① AND ②」の形を登録?すると、GridViewに表示できると思います。

ただ、ここで躓いていることがあります。
それは、「①を選択するたけでなく、②も入力しなければ、GridViewに表示されない」という点です。
②を入力しなくても(都道府県だけ選んでボタンを押しても)GridViewに表示できるようにするには、どうすればいいですか?

よろしくお願い致します。

--------------以下、SurferOnWww様の回答を受けての追加質問-------------------
ご回答してくださりありがとうございます。

何を作っているかや環境についての説明が不足し、申し訳ございませんでした。
作っているもの:ASP.NET Web Forms
.NET のバージョン:.NET Framework 4.5
DBサーバーとそのバージョン:SQL Server 2012
デバック実行時のブラウザ:IE
環境については以上です。

次に、表題の件について。
いただいたアドバイスをもとに、SQL上で(2)を試したところ無事求めていたものが得られました。
ただ、お伝えし忘れていたことがありました。申し訳ございません。
①はDropDownListなのですが、②はTextBoxを使用しています。

例えば、
【1】「大阪府」で検索する場合
①で「大阪府」を選択し、②は入力せずに、検索ボタンをクリックする。
【2】「大阪府大阪」で検索する場合
①で「大阪府」を選択し、②で「大阪」とだけ手入力し、検索ボタンをクリックする。
ということをしたいです。

このとき、
【1】は
WHERE [都道府県] = '大阪府' AND [市区町村] = '全て'
【2】は
WHERE [都道府県] = '大阪府' AND [市区町村] LIKE '%大阪%'
ということで合っていますか?
で、【1】【2】を満たせるようなWhere句が
WHERE ([都道府県]=@都道府県)
AND (@市区町村="全て" OR [市区町村]=@市区町村)
である、という理解で問題ないでしょうか?

Q1.
>市区町村 TextBox の初期値を"全て"とし
と書いていらっしゃいました。
初期値を設定してしまうと、実行時にTextBox内にすでに文字が入力されている状態になるのではありませんか?
私の言っている初期値と、SurferOnWww 様のおっしゃる初期値に違いがありましたらごめんなさい。
で、もし「実行時にTextBox内にすでに文字が入力されている状態になる」のでしたら、それは避けたいので、"全て"にするにはどうすればいいのだろうかと悩んでおります。
[市区町村] like '%' 
にすれば、すべて表示されるかなと考え、
AND (@市区町村 LIKE '%' OR [市区町村] LIKE '%'+ @市区町村 +'%')
のようにステートメントを書き換え、【1】を実行しましたが、テーブルには何も表示されませんでした。
どういうステートメントを作成すればよろしいのでしょうか。

超初心者で大変申し訳ございませんが、再度アドバイスいただけると幸いです。
よろしくお願い致します。

  • 回答欄に【追伸】として追加質問に対するレスを追加しておきました。 -
  • 長らくお返事ができず失礼致しました。
    なんとか求めているものを作ることができました。
    ありがとうございました。
    -

回答

質問する際は、一番最初に、何を作っているのか(ASP.NET Web Forms? WPF? その他?)、ご自分の環境(OS, VS のバージョンだけではなく .NET のバージョン、DB サーバーとそのバージョン、ブラウザを使っているなら何かなど)に関する情報を書いてください。

たぶん ASP.NET Web Forms アプリの質問であろうと想像してレスします。

②を入力しなくても(都道府県だけ選んでボタンを押しても)GridViewに表示できるようにするには、

その時表示するのは Where ① という条件だけで選択した全レコードを表示するということでいいのですよね?

であれば、以下のいずれかで可能だと思います。(2) がオススメです。

(1) SqlDataSource の SelectCommand を切り替える。具体例は以下の記事を見てください。

SelectCommand の切り替え
http://surferonwww.info/Test/01_Test.aspx

(2) WHERE 句を以下のようにしておき、市区町村 TextBox の初期値を "全て"(別のものでもいいですが WHERE 句と合わせてください)とし、ユーザーが初期値を変えなければ WHERE 句の (@市区町村="全て" OR [市区町村]=@市区町村) は true になるようにする。

WHERE ([都道府県]=@都道府県)
AND (@市区町村="全て" OR [市区町村]=@市区町村)

具体例は、①, ② とも DropDownList の例ですが、以下の記事を見てください。

DropDownList を使って絞込み
http://surferonwww.info/BlogEngine/post/2011/07/17/Showing-records-selected-by-DropDownLists-into-GridView.aspx

不明点があれば質問してください。

【2016/11/4 13:45 追伸】

追加質問に対して以下にレスします。

まず、先のレスの (@市区町村="全て" OR [市区町村]=@市区町村) は (@市区町村='全て' OR [市区町村]=@市区町村) の間違いでした(リテラルはデフォルトで 単一引用符)。すみません。

【1】は
WHERE [都道府県] = '大阪府' AND [市区町村] = '全て'
【2】は
WHERE [都道府県] = '大阪府' AND [市区町村] LIKE '%大阪%'

LIKE 句を使うのであれば以下のようにして試してみてください。

WHERE ([都道府県]=@都道府県)
AND (@市区町村='全て' OR [市区町村] LIKE N'%' + @市区町村 + N'%')

【1】【2】を満たせるようなWhere句が
WHERE ([都道府県]=@都道府県)
AND (@市区町村="全て" OR [市区町村]=@市区町村)
である、という理解で問題ないでしょうか?

上に書いたように違います。LIKE 句を使いたいならそれをクエリに含めないと。

ところで、(@市区町村='全て' OR [市区町村]=@市区町村) の意味は理解されているでしょうか?

パラメータ @市区町村 には TextBox の Text プロパティの値が代入されるように設定します。

なので、TextBox が "全て" になっていると、(@市区町村='全て' OR [市区町村]=@市区町村) は常に true になり、WHERE ① AND ② は WHERE ① と同じになります。

ユーザーが TextBox に入力して "全て" を例えば "大阪" に変更した場合、(@市区町村='全て' OR [市区町村]=@市区町村) で二つ目の条件 [市区町村]='大阪' だけが有効になります。結果、WHERE ① AND ② で(② に LIKE 句を使うならそのように)検索できます。

もし「実行時にTextBox内にすでに文字が入力されている状態になる」のでしたら、それは避けたいので、"全て"にするにはどうすればいいのだろうかと悩んでおります。

質問の意味が分かりません。TextBox の初期値は空白にしておきたいと言うことですか? であれば、以下のようにして試して見てはいかがですか? ただし、空白でうまく動くかどうかは分かりません。ご自分で十分検証してください。

WHERE ([都道府県]=@都道府県)
AND (@市区町村='' OR [市区町村] LIKE N'%' + @市区町村 + N'%')

#個人的には TextBox が空白で全件表示されるのはユーザーにとってはどうかと思うのですが。

編集 履歴 (1)
  • ご回答してくださりありがとうござます。

    何を作っているかや環境についての説明が不足し、申し訳ございませんでした。
    作っているもの:ASP.NET Web Forms
    .NET のバージョン:.NET Framework 4.5
    DBサーバーとそのバージョン:SQL Server 2012
    デバック実行時のブラウザ:IE
    以上です。
    (文字数の制限に引っかかったので分けますね)
    -
  • (続き1)
    いただいたアドバイスをもとに、SQL上で(2)を試したところ無事求めていたものが得られました。
    そこで、VB上で作っていたのですが…ここで質問があります。
    (@市区町村="全て" OR [市区町村]=@市区町村)の作り方についてです。
    私はいつも[GridViewタスク]-[データソースの構成]を用いて、Selectステートメントを作っています。
    (続きます)
    -
  • (続き2)

    ごめんなさい、コメントの削除の仕方がわからないので、
    質問の回答欄にて再度コメントさせていただきたいです。
    ご了承いただけると幸いです。
    -
  • 最初のご自分の質問欄に追記する形でかけるはずです。最初の質問はそのまま残しておくようお願いします(削除したり編集したりすると、あとで読む人にとっては訳がわからなくなりますので) -
  • 「最初のご自分の質問欄に追記する形で」(解答欄ではなくて)とお願いしたのですが、できなかったでしょうか? 質問者の方が回答欄に追加質問されたのでは、特に検索などでここいたどり着いてこのスレッドを読む人などには訳がわからなくなってしまいます。 -
  • 今からでも回答欄に書いた追加質問は一番上のあなたの質問欄に移していただけないでしょうか? 追記する際は【SurferOnWww の回答を受けての追加質問】とでも書いて、最初の質問に続けて追加質問を追記したいただくと分かりやすいと思います。 -
  • そして、回答欄に書いた質問は削除していただくようお願いします。欄ごと削除することができなければ、編集して中身を削除し代わりに「追加質問は回答欄に移した」旨書いていただければと思います。 -
  • 大変失礼致しました。
    コメントをいただいているのに、見落としていました。
    昨日回答欄に記載した内容は、すべて質問欄に追記する形で移しました。
    お忙しい中、お手数をおかけして誠に申し訳ございませんでした。
    -
  • 回答欄に【追伸】として追加質問に対するレスを追加しておきました。 -
  • 長らくお返事ができず失礼致しました。
    なんとか求めているものを作ることができました。
    ありがとうございました。
    -

削除しました。

編集 履歴 (2)
ウォッチ

この質問への回答やコメントをメールでお知らせします。