OleDbDataReader を使用して Access データベースから列を読み取っていますが、同じリーダーを使用して同じ関数で列を再度読み取れるようにしたいと考えています。データベースは同じ順序ではないため、指定されたレコードが見つかるまでデータベースをループして比較する必要があります。
質問は
の現在の行インデックスを取得する関数はありOleDbDataReader
ますか?
どうすればOleDbDataReader
最初の行にリセットできますか?
OleDbDataReader を使用して Access データベースから列を読み取っていますが、同じリーダーを使用して同じ関数で列を再度読み取れるようにしたいと考えています。データベースは同じ順序ではないため、指定されたレコードが見つかるまでデータベースをループして比較する必要があります。
質問は
の現在の行インデックスを取得する関数はありOleDbDataReader
ますか?
どうすればOleDbDataReader
最初の行にリセットできますか?
MSDNによると、OleDbDataReader
クラス
データソースからデータ行の順方向のみのストリームを読み取る方法を提供します。
つまり、前の行に戻る方法はありません。現在の行を読み取るか、次の行に移動するだけです。任意の行にランダムにアクセスできるようにする必要がある場合、一般的な解決策は、すべての行をaなどのリストにロードしてから、リストDataTable
内の行を処理することです。
リーダーは前方読み取り専用に設計されているため、最初にリセットすることはできません。
この種の問題に対処するには、他にもいくつかの方法があります。
比較しているデータ セットのサイズが適切で、1 つのフィールドで比較している場合は、1 つのデータベースのデータを汎用辞書などのキー付きオブジェクトにキャッシュできます。次に、2 番目のデータベースからデータを読み取るときに、キーに基づいてディクショナリから詳細を取得し、その方法で比較を実行できます。
リーダーをネストするのではなく、1 つのデータベースの各レコードに対してスタンドアロン クエリを発行して、2 番目のデータベースに一致があるかどうかを確認できます。
私は同様の問題を解決しています.DataTableを使用することは、データリーダーの前方のみの問題を回避する最も簡単な方法でした.
DataTable table = new DataTable("DataTable");
for (int colNum = 0; colNum < reader.FieldCount; colNum++)
{
DataColumn col = new DataColumn();
col.ColumnName = reader.GetName(colNum);
table.Columns.Add(col);
}//colNum
while (reader.Read())
{
DataRow row = table.NewRow();
for (int colNum = 0; colNum < reader.FieldCount; colNum++)
{
string columnName = reader.GetName(colNum);
row[columnName] = reader.GetValue(colNum);
}//for
table.Rows.Add(row);
}//while
table.AcceptChanges();
カルロス・メリゲ。