プロが教えるわが家の防犯対策術!

Visual C# 2010 Expressと.NET Framework 4.5での質問です。

Accessデータベースの複数のフィールドに対して条件をつけて検索したいと思っています。

dView = new DataView(dSet.Tables["t_" + (テーブル名)]
,"(フィールド1に対する条件式)" , "", DataViewRowState.CurrentRows);

dView = new DataView(dSet.Tables["t_" + (テーブル名)]
, "(フィールド2に対する条件式)", "", DataViewRowState.CurrentRows);
this.dataGridView2.DataSource = dView;

参照元のテーブル名が同じであるためか、これを実行すると後半のフィールド2に対する
条件式を満たすレコードがすべてdataGridViewに表示される結果になります。
両方の条件を満たすレコードだけを表示するにはどうしたらいいでしょうか。
C#などの本でも、データベースに関してはそれほど詳しくは書いていないので困っています・・・。

どうか、よろしくお願いします。

A 回答 (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["文字列型フィールド"] == 文字列型変数
としてください。

この回答への補足

回答有難うございました。

> A AND B
> B AND A
> (Aは文字列型フィールド、Bはdouble型フィールド)
> 両方とも、Aの条件に合うレコードが全部書かれてしまう状況です。
AとBの両方の条件に合うレコードが出てくるはずです。
Bの条件に合わないレコードはでていますか?

改めてソース全体を見なおしたところ、教えていただいた方法(RowFilter)で無事に解決出来ました。
潜在していたバグも一緒に潰すことができて、二重に感謝しています。
本当にありがとうございました。

補足日時:2013/08/23 10:45
    • good
    • 0
この回答へのお礼

重ね重ねありがとうござます。

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

お礼日時:2013/08/22 14:58

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 …

この回答への補足

回答ありがとうございます。動作システムについての記述が曖昧ですみませんでした。

>(r["フィールド1"]に対する条件式)

の記述の仕方ですが、例えば、
r["double型フィールド"] >= double型変数

と書くと、>=はobjectとdouble型のオペランドの間では使えないと言われ、

r["文字列型フィールド"] = '文字列型変数'

と書くと、'文字列型変数'のところで文字リテラルに文字が多すぎると言われます。

出て当たり前のエラーなのだとは思いますが、対処方法がわからず困っています。
どうか教えていただけないでしょうか。

補足日時:2013/08/21 11:23
    • good
    • 0

> 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以下の部分が反映されている感じです。
条件式は正しいですか?

この回答への補足

たびたび失礼します。

http://msdn.microsoft.com/ja-jp/library/bb669073 …

上記MSDN内に次のような記述がありました。

「式ベースのフィルターは、文字列ベースのフィルターよりもはるかに強力で複雑なフィルター機能を提供します。
文字列ベースのフィルターと式ベースのフィルターは、相互に排他的です。
DataView をクエリから作成した後に文字列ベースの RowFilter を設定した場合、
クエリから推論される式ベースのフィルターはクリアされます。 」

私の場合、double型フィールドの数字と文字列型フィールドの内容を使ってレコードを抽出しようと
していますが、これは不可能ということでしょうか。
実際、文字列型フィールドの方しか機能していないような動きです。

A AND B
B AND A
(Aは文字列型フィールド、Bはdouble型フィールド)

両方とも、Aの条件に合うレコードが全部書かれてしまう状況です。

補足日時:2013/08/21 13:49
    • good
    • 0
この回答へのお礼

たびたびの回答ありがとうございます。

>(+演算子でだらだら繋いでいくよりもstring.Format等を使った方が見やすいかと)

なるほど、コードがすっきりして見やすいですね。
アドバイスありがとうございます。
しかし、作っていただいたコードでも、AND以下しか反映されない・・・。
いろいろ試してみます、お忙しいところありがとうございました!



>条件式は正しいですか?

条件式を個々に検索するとちゃんと動くので、間違っていないと思います。

お礼日時:2013/08/21 10:07

SQLのWHERE句と似たような感じで書けばOKです。


http://msdn.microsoft.com/ja-jp/library/system.d …

たとえば、Nameフィールドが"hoge"でAgeフィールドが20である行を抽出したい場合、
 dView = new DataView(dSet.Tables["TableName"], "Name='hoge' AND Age=20", "", DataViewRowState.CurrentRows);
と書くことができます。


本を読んだりサイトを探したりするのも有用ですが、
一番の情報源はMSDNライブラリです。
クラス名やメソッド名にカーソルを合わせてF1キーを押してみてください。

この回答への補足

回答有難うございました。さっそく以下の様なコードを書いてみました。

dView = new DataView(dSet.Tables["テーブル名"]
, "(数値型フィールド)>=" + co.ToString("0.0") + " AND "
           + "(文字列型フィールド)='" + 文字列変数 + "'" , "",                       DataViewRowState.CurrentRows);

実行結果はAND以下の部分が反映されている感じです。
ANDを""で囲わずにベタ打ちすると構文エラーになってしまいます。
Unicode文字列にしろと怒られます・・・。

MSDNやSQLのサイトなど探していますが、いまいちわかりません。。。
申し訳ありません。どこが間違っているのでしょうか。

補足日時:2013/08/20 16:25
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/08/21 10:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!