QA@IT
«回答へ戻る

回答を投稿

コメント欄でやり取りしていても、書ける文字数の制限もあって空回りが止まらないような気がしますので、一旦リセットしてこの回答から話を進めたいと思います。

質問者さんのコメントを見ると、現状は、SqlDataSource と GridView を使って、

(1) 条件なし、即ち SELECT ID, name, price, f1, f2, f3 FROM menu というクエリで全レコードの抽出と表示はできている。

(2) クエリに WHERE (name LIKE '%' + @name + '%') を追加して TextBox からの入力で条件を付けてレコードを抽出して表示することもできている。

(3) さらに WHERE 句に OR (f1 <> @f1) OR (f2 <> @f2) OR (f3 <> @f3) の条件を追加し、CheckBox を 3 つ追加し、それぞれの Checked プロパティの値をパラメータ @f1, @f2, @f3 に代入するようにしたところ、期待に反して全レコードが抽出されてしまう。

そして、現在の問題は、(3) で、CheckBox のチェックに応じて条件が絞られて特定のレコードだけが抽出・表示されると期待したが、期待に反して全レコードが抽出されてしまう。

・・・ということと理解しています。理解が違っていたら、どこがどう違うのか詳しく書いてください。

全レコードが抽出されてしまうのは WHERE 句全体の条件が true になるからです。条件を OR でつないでいるので条件のどれか一つでも true になれば WHERE 句全体の条件は true になります。

それが NG ということであれば、質問者さんが WHERE 句に設定した条件が、DB のレコードの実態と目的に合ってないということになります。

上にも書きましたが、質問に書いてある《やりたいこと》が自分には意味不明ですので、WHERE (f1 <> @f1) OR (f2 <> @f2) OR (f3 <> @f3) が質問者さんの求める条件に合うかどうかは自分は分かりません。

だから、「違うのであれば書き直したクエリを連絡ください。」とお願いしました。DB のレコードの実態と目的に沿って書き直してください。

コメント欄でやり取りしていても、書ける文字数の制限もあって空回りが止まらないような気がしますので、一旦リセットしてこの回答から話を進めたいと思います。

質問者さんのコメントを見ると、現状は、SqlDataSource と GridView を使って、

(1) 条件なし、即ち SELECT ID, name, price, f1, f2, f3 FROM menu というクエリで全レコードの抽出と表示はできている。

(2) クエリに WHERE (name LIKE '%' + @name + '%') を追加して TextBox からの入力で条件を付けてレコードを抽出して表示することもできている。

(3) さらに WHERE 句に OR (f1 <> @f1) OR (f2 <> @f2) OR (f3 <> @f3) の条件を追加し、CheckBox を 3 つ追加し、それぞれの Checked プロパティの値をパラメータ @f1, @f2, @f3 に代入するようにしたところ、期待に反して全レコードが抽出されてしまう。

そして、現在の問題は、(3) で、CheckBox のチェックに応じて条件が絞られて特定のレコードだけが抽出・表示されると期待したが、期待に反して全レコードが抽出されてしまう。

・・・ということと理解しています。理解が違っていたら、どこがどう違うのか詳しく書いてください。

全レコードが抽出されてしまうのは WHERE 句全体の条件が true になるからです。条件を OR でつないでいるので条件のどれか一つでも true になれば WHERE 句全体の条件は true になります。

それが NG ということであれば、質問者さんが WHERE 句に設定した条件が、DB のレコードの実態と目的に合ってないということになります。

上にも書きましたが、質問に書いてある《やりたいこと》が自分には意味不明ですので、WHERE (f1 <> @f1) OR (f2 <> @f2) OR (f3 <> @f3) が質問者さんの求める条件に合うかどうかは自分は分かりません。

だから、「違うのであれば書き直したクエリを連絡ください。」とお願いしました。DB のレコードの実態と目的に沿って書き直してください。