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#などの本でも、データベースに関してはそれほど詳しくは書いていないので困っています・・・。
どうか、よろしくお願いします。
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["文字列型フィールド"] == 文字列型変数
としてください。
この回答への補足
回答有難うございました。
> A AND B
> B AND A
> (Aは文字列型フィールド、Bはdouble型フィールド)
> 両方とも、Aの条件に合うレコードが全部書かれてしまう状況です。
AとBの両方の条件に合うレコードが出てくるはずです。
Bの条件に合わないレコードはでていますか?
改めてソース全体を見なおしたところ、教えていただいた方法(RowFilter)で無事に解決出来ました。
潜在していたバグも一緒に潰すことができて、二重に感謝しています。
本当にありがとうございました。
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 …
この回答への補足
回答ありがとうございます。動作システムについての記述が曖昧ですみませんでした。
>(r["フィールド1"]に対する条件式)
の記述の仕方ですが、例えば、
r["double型フィールド"] >= double型変数
と書くと、>=はobjectとdouble型のオペランドの間では使えないと言われ、
r["文字列型フィールド"] = '文字列型変数'
と書くと、'文字列型変数'のところで文字リテラルに文字が多すぎると言われます。
出て当たり前のエラーなのだとは思いますが、対処方法がわからず困っています。
どうか教えていただけないでしょうか。
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以下の部分が反映されている感じです。
条件式は正しいですか?
この回答への補足
たびたび失礼します。
http://msdn.microsoft.com/ja-jp/library/bb669073 …
上記MSDN内に次のような記述がありました。
「式ベースのフィルターは、文字列ベースのフィルターよりもはるかに強力で複雑なフィルター機能を提供します。
文字列ベースのフィルターと式ベースのフィルターは、相互に排他的です。
DataView をクエリから作成した後に文字列ベースの RowFilter を設定した場合、
クエリから推論される式ベースのフィルターはクリアされます。 」
私の場合、double型フィールドの数字と文字列型フィールドの内容を使ってレコードを抽出しようと
していますが、これは不可能ということでしょうか。
実際、文字列型フィールドの方しか機能していないような動きです。
A AND B
B AND A
(Aは文字列型フィールド、Bはdouble型フィールド)
両方とも、Aの条件に合うレコードが全部書かれてしまう状況です。
たびたびの回答ありがとうございます。
>(+演算子でだらだら繋いでいくよりもstring.Format等を使った方が見やすいかと)
なるほど、コードがすっきりして見やすいですね。
アドバイスありがとうございます。
しかし、作っていただいたコードでも、AND以下しか反映されない・・・。
いろいろ試してみます、お忙しいところありがとうございました!
>条件式は正しいですか?
条件式を個々に検索するとちゃんと動くので、間違っていないと思います。
No.1
- 回答日時:
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のサイトなど探していますが、いまいちわかりません。。。
申し訳ありません。どこが間違っているのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセスの更新クエリでカレントレコードのみ更新したい 1 2022/06/02 23:32
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- その他(データベース) IT用語について質問です。 以前ITパスポートの試験を受けた際にデータベースが何の集まりかについての 2 2022/12/10 12:29
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Access(アクセス) Accessフォームで複数条件でフィールドの値を表示する方法 4 2022/07/21 10:47
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
accessでフィールド追加のあと...
-
テーブルのデータ型の変更がで...
-
クリスタルレポートで困ってい...
-
Accessのフィールド名に半角括...
-
DataTableに特定のフィールドが...
-
DataTableのselectメソッド
-
Access 2010で実行時エラー3061
-
ノーツ:ユーザ名から別名を取...
-
INT64対応のprintf系関数はあり...
-
2つ目のレコードの値を取得す...
-
NULLを含む文字列の結合で...
-
フィールド名の指定でエラー
-
【ExcelVBA】値を変更しながら...
-
VBA 変数名に変数を使用したい。
-
他のMDBのテーブルに追加したい
-
Dir関数で読み取り順を操作でき...
-
エクセルのテーブルを解除する...
-
Excel複数シートをaccessへ一括...
-
vba フィルター 複数条件 3つ以...
-
グラフの「項目軸ラベルに使用...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessのフィールド名に半角括...
-
DataTableに特定のフィールドが...
-
accessでフィールド追加のあと...
-
INT64対応のprintf系関数はあり...
-
2つ目のレコードの値を取得す...
-
Access 2010で実行時エラー3061
-
日付と文字列を条件としてDLook...
-
AccessのDAOでフィールド名を配...
-
SQLで複数のテーブルと結合した...
-
テーブルのデータ型の変更がで...
-
フィールド名をループの添え字...
-
クリスタルレポート(8.5)の書式...
-
AccessVBAで他テーブルのデータ...
-
Accessの画像挿入のVBAコード
-
アクセスでADO 並べ替えが適用...
-
NULLを含む文字列の結合で...
-
クリスタルレポートで文字列の...
-
ACCESSデータベースにV...
-
ノーツ:ユーザ名から別名を取...
-
Access クエリで変数を参照する...
おすすめ情報