QA@IT

C#でdatatableを検索し、検索した行(レコード)があるかどうかチェックする方法はないでしょうか。

13722 PV

 //if文でdatatable dtに検索する値があるかどうかチェックする。
  if (DataRow[] dt = datatableA.Select("ShisetsuCode = '" + rShisetsuCode + "'", "FoodCode = '" + rCode + "'" == true))
{
    //検索した結果がtrue(datatableを検索し値がある)何か処理する。
}

上のような感じで処理をC#で書きたいのですがよい方法を教えてください。お願いします。
漠然としていてすいません。よろしくおねがいします。

visual studio 2010を使用しています。

  • ご自分の環境(OS, .NET のバージョンなど)を最初に書きませんか? フィルタにかからなかった時に dt がどうなるか、まずご自分で調べてみませんか? -
  • Windows 8 pro で .NETが2.0です。FoodCode = '00001'が見つかりませんでしたと表示されました。 -
  • 「FoodCode = '00001'が見つかりませんでした」となるのはどこかが間違っているからです。まず C# の文法上正しくなったいるか、よく見てください。(先のスレッドでそのあたりのことは解決できていたはずなんですが・・・) -
  • 先のスレッドで flied_onion さんの回答のコードでうまくいったと書いてあっったのですが、それと今回アップされたコードが違いますがどうなっているんでしょう。アップされたコードではコンパイラも通らないのでは。うまくいった時点に戻しませんか? そして、そこで dt(先のコードでは rows)がフィルタにかかる/かからないでどうなるか見てみては? -
  • flied_onionさんの回答でうまくいったのですが、プログラムを作っていると、別の問題が発生してしまって質問という形になりますた。その問題が例えば、テーブルの列に種類の違うコードが混在していて検索したのもがあるかどうかというのを、trueかfalseで返したいのですが、うまくいく方法があれば、教えていただきたいのですが、よろしくお願いします。 -
  • 「テーブルの列に種類の違うコードが混在していて検索したのもがあるかどうか」というところ、意味が分かりません。コメント欄には書ききれないでしょうから、上の質問のところに追記する形で説明してください。 -
  • それから、文法的に間違っていて、コンパイラも通らないようなコードをアップするのは避けてください。コンパイラは通っても「FoodCode = '00001'が見つかりませんでした」というようなおかしなことに、少なくとも上のコードで dt に正しくフィルタリング結果が取れるまで作りこんでください。 -
  • ご指摘ありがとうございます。少しやってみます。 -

回答

DataRow[] dt = datatableA.Select(String.Format("ShisetsuCode = '{0}' And FoodCode = '{1}'", rShisetsuCode, rCode));
if (dt.Length > 0)
{
    //データが存在している時の処理
}

こんな感じですかね。

条件文の文字列を+演算子で連結する方法は見た目分かりにくいので
String.Formatなどで条件文字列の全体が分かりやすい方法を使用された
方がよいかと思います。

編集 履歴 (0)
  • ありがとうございます。やってみます。
    -
  • ご親切にありがとうございます。とても勉強になります。 -

前回のコード ( http://qa.atmarkit.co.jp/q/3632 ) の感じから、
サンプルを試しに改造してみながら実行されているような印象を受けます。

それ自体は構いませんが、一旦動いたのであれば 各行やメソッドが何を受け取って何を返してくれるのかも考えるようにされるとよいと思います。

たとえば

int a = 1 + 2 + 3 + 4;

は 実行されると a には 結局 10が入る事になるのはわかると思います。
前回は

DataRow[] rows = tblAuthors2.Select("NoShisetu= rNoShisetu and FoodCode = rFoodCode");

DataRow[] rows = tblAuthors2.Select("NoShisetu= '" + rNoShisetu + "' and FoodCode = '" + rFoodCode + "'");

にしたら動くようになりましたが、プログラムが動くと 直した方では Selectメソッドに
何を渡したことになっているのか。
Selectメソッドは何を返す事になっているのか ( どういうものをrowsとして受け取るのか )。
などを考えてみましょう。


今回の

if (DataRow[] dt = datatableA.Select("ShisetsuCode = '" + rShisetsuCode + "'", "FoodCode = '" + rCode + "'" == true))

trueの部分は おそらくは

// これでも 動かないコード
if (  DataRow[] dt = datatableA.Select("ShisetsuCode = '" + rShisetsuCode + "'", "FoodCode = '" + rCode + "'" )     == true )

のような、Selectできたなら 成功値が返ってくれないかという事でしょうが、残念ながらこれでも文法的にもおかしいですし、Selectに成功してもそういう値は返らないのでこれではうまくいきません。

また、 Selectメソッドには

"ShisetsuCode = '" + rShisetsuCode + "'", "FoodCode = '" + rCode + "'"

を渡していることになりますが、これは
"ShisetsuCode = '" + rShisetsuCode + "'""FoodCode = '" + rCode + "'" の 2つの引数を渡していることになります。
Selectメソッドでは 1つ目と 2つ目は 別の用途に使われます。
そして今回エラーがでているのは、その別の用途に使われる 2つ目の引数に間違ったものを渡しているためです。

Selectメソッド
http://msdn.microsoft.com/ja-jp/library/way3dy9w(v=vs.110).aspx
パラメータ の部分を見てみてください。

カンマで区切っていなかったはこちらです。
http://msdn.microsoft.com/ja-jp/library/det4aw50(v=vs.110).aspx

また戻り値 の部分に書いてある説明から、 dt が何なのかを調べる手がかりにされるとよいでしょう。
(実際のところわかっていればそこに書いてあるそのままなんですが、もし「配列」などもまだよくわからなければ入門サイトなどで調べてみるといいと思います。)

Shu さんの提示された String.Formatなども覚えると便利ですので調べて習得されるといいとおもいます(基本の使い方はわかっちゃえば単純だとおもいます)。

長文失礼。

編集 履歴 (1)
  • とても勉強になります。ありがとうございます。 -
ウォッチ

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