OK、DataRow
をDataReader
から抽出したいと思います。私はかなり長い間探し回っていましたが、これを行う簡単な方法があるようには見えません。
DataReader
は行のコレクションであると理解していますが、一度に1行しか読み取れません。
私の質問:DataRow
の現在の行からDataReader
を抽出する方法はありますか?
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];
}
}
}
しかし、それは本当に効率的ではありません。
次のような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
を放棄しない理由はありません。