• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C#での複数フィールドの条件付き抽出について)

C#で複数フィールドの条件付き抽出について

このQ&Aのポイント
  • C#を使用して、複数のフィールドに対して条件を付けて検索する方法について質問です。
  • Accessデータベースで、複数のテーブルに対して同じ条件を満たすレコードを抽出する方法について教えてください。
  • データベースに関する知識が乏しいため、本や他の情報源では解決策が見つからなかったので、助けを求めています。

質問者が選んだベストアンサー

  • ベストアンサー
  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.4

> 「式ベースのフィルターは、文字列ベースのフィルターよりもはるかに強力で複雑なフィルター機能を提供します。 > 文字列ベースのフィルターと式ベースのフィルターは、相互に排他的です。 > DataView をクエリから作成した後に文字列ベースの RowFilter を設定した場合、 > クエリから推論される式ベースのフィルターはクリアされます。」 ここで言う「クエリ」とは#3の方が使っておられる、LINQを使った抽出方法のことを指します。 RowFilterを使った抽出(#1, #2の方法)とクエリを使った抽出(#3の方法)は両立できませんよー、ということを述べています。 > A AND B > B AND A > (Aは文字列型フィールド、Bはdouble型フィールド) > 両方とも、Aの条件に合うレコードが全部書かれてしまう状況です。 AとBの両方の条件に合うレコードが出てくるはずです。 Bの条件に合わないレコードはでていますか? 望んだ結果が得られないなら、一度AccessでSQLを書いて抽出条件を再度確認した方がいいかもしれません。 > r["double型フィールド"] >= double型変数 r["フィールド名"]はフィールドの型によらずobject型になりますので、 double型にキャストしてください。 > r["文字列型フィールド"] = '文字列型変数' r["文字列型フィールド"] == 文字列型変数 としてください。

mattari96
質問者

お礼

重ね重ねありがとうござます。 私事で恐縮ですが、体調不良のため検証が遅れます。 申し訳ありません。

mattari96
質問者

補足

回答有難うございました。 > A AND B > B AND A > (Aは文字列型フィールド、Bはdouble型フィールド) > 両方とも、Aの条件に合うレコードが全部書かれてしまう状況です。 AとBの両方の条件に合うレコードが出てくるはずです。 Bの条件に合わないレコードはでていますか? 改めてソース全体を見なおしたところ、教えていただいた方法(RowFilter)で無事に解決出来ました。 潜在していたバグも一緒に潰すことができて、二重に感謝しています。 本当にありがとうございました。

その他の回答 (3)

回答No.3

VC# 2010は.NET Framework 4.5を対象とするプログラムを作れませんが……。 # .NET Framework 2.0/3.0/3.5/3.5 Client Profile/4/4 Client Profile対象。 それはともかく,DataSetに対してもLINQが使えるので, dSet.Tables["t_" + (テーブル名)].AsEnumerable().Where(r => (r["フィールド1"]に対する条件式) && (r["フィールド2"]に対する条件式)).AsDataView() とか, (from r in dSet.Tables["t_" + (テーブル名)].AsEnumerable() where (r["フィールド1"]に対する条件式) && (r["フィールド2"]に対する条件式)).AsDataView() でDataViewが取得できます。 AsDataViewが使える条件については,以下を参照して下さい。 http://msdn.microsoft.com/ja-jp/library/bb669080(v=vs.100).aspx

mattari96
質問者

補足

回答ありがとうございます。動作システムについての記述が曖昧ですみませんでした。 >(r["フィールド1"]に対する条件式) の記述の仕方ですが、例えば、 r["double型フィールド"] >= double型変数 と書くと、>=はobjectとdouble型のオペランドの間では使えないと言われ、 r["文字列型フィールド"] = '文字列型変数' と書くと、'文字列型変数'のところで文字リテラルに文字が多すぎると言われます。 出て当たり前のエラーなのだとは思いますが、対処方法がわからず困っています。 どうか教えていただけないでしょうか。

  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.2

> ANDを""で囲わずにベタ打ちすると構文エラーになってしまいます。 DataViewコンストラクタのRowFilter引数はstring型ですので、 ANDは""で囲う必要があります。 (+演算子でだらだら繋いでいくよりもstring.Format等を使った方が見やすいかと) string rowFilter = string.Format("Field1 >= {0:0.0} AND Field2 = '{1}'", co, 文字列変数); dView = new DataView(dSet.Tables["テーブル名"], rowFilter, "", DataViewRowState.CurrentRows); > 実行結果はAND以下の部分が反映されている感じです。 条件式は正しいですか?

mattari96
質問者

お礼

たびたびの回答ありがとうございます。 >(+演算子でだらだら繋いでいくよりもstring.Format等を使った方が見やすいかと) なるほど、コードがすっきりして見やすいですね。 アドバイスありがとうございます。 しかし、作っていただいたコードでも、AND以下しか反映されない・・・。 いろいろ試してみます、お忙しいところありがとうございました! >条件式は正しいですか? 条件式を個々に検索するとちゃんと動くので、間違っていないと思います。

mattari96
質問者

補足

たびたび失礼します。 http://msdn.microsoft.com/ja-jp/library/bb669073(v=vs.100).aspx 上記MSDN内に次のような記述がありました。 「式ベースのフィルターは、文字列ベースのフィルターよりもはるかに強力で複雑なフィルター機能を提供します。 文字列ベースのフィルターと式ベースのフィルターは、相互に排他的です。 DataView をクエリから作成した後に文字列ベースの RowFilter を設定した場合、 クエリから推論される式ベースのフィルターはクリアされます。 」 私の場合、double型フィールドの数字と文字列型フィールドの内容を使ってレコードを抽出しようと していますが、これは不可能ということでしょうか。 実際、文字列型フィールドの方しか機能していないような動きです。 A AND B B AND A (Aは文字列型フィールド、Bはdouble型フィールド) 両方とも、Aの条件に合うレコードが全部書かれてしまう状況です。

  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.1

SQLのWHERE句と似たような感じで書けばOKです。 http://msdn.microsoft.com/ja-jp/library/system.data.datacolumn.expression%28v=vs.80%29.aspx たとえば、Nameフィールドが"hoge"でAgeフィールドが20である行を抽出したい場合、  dView = new DataView(dSet.Tables["TableName"], "Name='hoge' AND Age=20", "", DataViewRowState.CurrentRows); と書くことができます。 本を読んだりサイトを探したりするのも有用ですが、 一番の情報源はMSDNライブラリです。 クラス名やメソッド名にカーソルを合わせてF1キーを押してみてください。

mattari96
質問者

お礼

お礼が遅くなりすみません。 補足にも対応していただき感謝しています。 ありがとうございます。

mattari96
質問者

補足

回答有難うございました。さっそく以下の様なコードを書いてみました。 dView = new DataView(dSet.Tables["テーブル名"] , "(数値型フィールド)>=" + co.ToString("0.0") + " AND "            + "(文字列型フィールド)='" + 文字列変数 + "'" , "",                       DataViewRowState.CurrentRows); 実行結果はAND以下の部分が反映されている感じです。 ANDを""で囲わずにベタ打ちすると構文エラーになってしまいます。 Unicode文字列にしろと怒られます・・・。 MSDNやSQLのサイトなど探していますが、いまいちわかりません。。。 申し訳ありません。どこが間違っているのでしょうか。