web-dev-qa-db-ja.com

DataReaderの現在の行からDataRowを取得する方法は?

OK、DataRowDataReaderから抽出したいと思います。私はかなり長い間探し回っていましたが、これを行う簡単な方法があるようには見えません。

DataReaderは行のコレクションであると理解していますが、一度に1行しか読み取れません。

私の質問:DataRowの現在の行からDataReaderを抽出する方法はありますか?

21
Rémi

DataReaderの現在の行からDataRowを抽出する方法はありますか?

いいえ、少なくとも簡単な方法はありません。すべてのDataRowは、1つの Table に属します。そのプロパティを空のままにしたり、テーブルを変更したりすることはできません(ImportRowを使用せずに)。

しかし、DataRowsが必要な場合は、最初にDataTableを入力してみませんか?

DataTable table = new DataTable();
using(var con = new SqlConnection("...."))
using(var da = new SqlDataAdapter("SELECT ... WHERE...", con))
    da.Fill(table);
// now you have the row(s)

本当にDataReaderから行を取得する必要がある場合は、 reader.GetSchemaTable 列に関するすべての情報を取得するには:

if (reader.HasRows)
{
    DataTable schemaTable = reader.GetSchemaTable();
    DataTable data = new DataTable();
    foreach (DataRow row in schemaTable.Rows)
    {
        string colName = row.Field<string>("ColumnName");
        Type t = row.Field<Type>("DataType");
        data.Columns.Add(colName, t);
    }
    while (reader.Read())
    {
        var newRow = data.Rows.Add();
        foreach (DataColumn col in data.Columns)
        {
            newRow[col.ColumnName] = reader[col.ColumnName];
        }
    }
}

しかし、それは本当に効率的ではありません。

25
Tim Schmelter

次のようなDataReaderコードがあるため、おそらく尋ねているでしょう。

_static void ViaDataReader(IDataReader rdr)
{
    while (rdr.Read())
        Console.WriteLine("{0,-27} {1,-46} {2,-25} {3}", rdr[0], rdr[1], rdr[2], rdr[3]);
}

/// ...

ViaDataReader(DbProviderFactories.GetFactoryClasses().CreateDataReader());
_

しかし、Timが指摘したように、前もって知っている各反復でDataRowが必要だという場合、代わりにDataTableを使用し、 Rowsプロパティを繰り返します(次の出力は上記と同じです):

_static void ViaDataTable(IDataReader rdr)
{
    var table = new DataTable();
    table.Load(rdr);
    foreach (DataRow row in table.Rows)
        Console.WriteLine("{0,-27} {1,-46} {2,-25} {3}", row[0], row[1], row[2], row[3]);
}

/// ...

ViaDataTable(DbProviderFactories.GetFactoryClasses().CreateDataReader());
_

何らかの理由でDataReaderを引き続き使用する必要がある場合、最初の例にループインデックス整数を追加し、(完全に事前にロードされたDataTableから各行を取得できると思います。 )各反復で。しかし、DataTableはより豊富であるため、DataTable.Load()を実行した後にDataReaderを放棄しない理由はありません。

2
Glenn Slayden