web-dev-qa-db-ja.com

C#のデータリーダーで行をループするにはどうすればよいですか?

while(dr.Read()){...}を使用できることはわかっていますが、それはテーブルのすべてのフィールドをループし、最初の行からすべての値を取得してから、2番目...のように取得します。

次のようなテーブルがあるとします。

ID--------------Value1--------------Value2------------------Value3
1               hello               hello2                  hello3
2               hi1                  hi2                      hi3

最初に取得したい、hellohello2およびhello3その後、2行目に移動してすべての値を取得します。

これを達成する方法はありますか?誰かが私の言っていることを理解してくれることを願っています。

申し訳ありませんが、これは現在解決されています。私は正しくコーディングしていませんでした...

そして、そうそうSqlDataReader.Read()メソッドは、それがするはずのことを行います、再び間違いは私のものでした。

40
Slacker616

これがDataReaderの動作方法であり、データベース行を一度に1つずつ読み取るように設計されています。

while(reader.Read()) 
{
  var value1 = reader.GetValue(0); // On first iteration will be hello
  var value2 = reader.GetValue(1); // On first iteration will be hello2
  var value3 = reader.GetValue(2); // On first iteration will be hello3
}
68
Rich O'Kelly
int count = reader.FieldCount;
while(reader.Read()) {
    for(int i = 0 ; i < count ; i++) {
        Console.WriteLine(reader.GetValue(i));
    }
}

注意;複数のグリッドがある場合:

do {
    int count = reader.FieldCount;
    while(reader.Read()) {
        for(int i = 0 ; i < count ; i++) {
            Console.WriteLine(reader.GetValue(i));
        }
    }
} while (reader.NextResult())
30
Marc Gravell

または、名前で直接列にアクセスしてみることができます。

while(dr.Read())
{
    string col1 = (string)dr["Value1"];
    string col2 = (string)dr["Value2"];
    string col3 = (string)dr["Value3"];
}
18
Tudor

「行全体」を一度に取得する方法はありません。行をループする必要があり、行ごとに各列を個別に読み取る必要があります。

using(SqlDataReader rdr = cmd.ExecuteReader())
{
    while (rdr.Read())
    {
        string value1 = rdr.GetString(0);
        string value2 = rdr.GetString(1);
        string value3 = rdr.GetString(2);
    }
}

各行で読み取る文字列をどのように処理するかは完全にあなた次第です-定義したクラスなどに保存できます。

6
marc_s

C#のデータリーダーで行をループするにはどうすればよいですか?

IDataReader.Read()は、リーダーを結果セットの次の行に進めます。

_while(reader.Read()){
    /* do whatever you'd like to do for each row. */
}
_

したがって、ループの反復ごとに、0から_reader.FieldCount_までの別のループを実行し、各フィールドに対してreader.GetValue(i)を呼び出します。

より大きな問題は、そのデータを保持するためにどのような構造を使用したいかです。

3
canon

実際には、結果セット内のレコードを反復処理するReadメソッド。あなたの場合-テーブルの行の上。だから、あなたはまだそれを使用することができます。

1
while (dr.Read())
{
    for (int i = 0; i < dr.FieldCount; i++)
    {
        subjob.Items.Add(dr[i]);
    }
}

1列の行を読み取る

0
irfan majeed