我正在使用 OleDbDataReader 从 Access 数据库中读取一列,并且我希望能够使用同一个阅读器在同一个函数中再次读取该列,因为我正在对 2 个数据库和有时相同的记录进行比较数据库的顺序不同,所以我必须遍历数据库,直到找到指定的记录然后进行比较。
问题是
是否有获取当前行索引的函数OleDbDataReader
?
以及如何将其重置OleDbDataReader
为第一行?
我正在使用 OleDbDataReader 从 Access 数据库中读取一列,并且我希望能够使用同一个阅读器在同一个函数中再次读取该列,因为我正在对 2 个数据库和有时相同的记录进行比较数据库的顺序不同,所以我必须遍历数据库,直到找到指定的记录然后进行比较。
问题是
是否有获取当前行索引的函数OleDbDataReader
?
以及如何将其重置OleDbDataReader
为第一行?
根据MSDN,OleDbDataReader
该类
提供一种从数据源读取只进数据行流的方法。
这意味着没有办法回到前一行。您所能做的就是阅读当前行或移至下一行。如果您需要能够随机访问任何行,典型的解决方案是将所有行加载到一个列表中,例如 a DataTable
,然后处理列表中的行。
您无法将阅读器重置为开始,因为它是专为只进阅读而设计的。
还有其他几种方法可以解决此类问题:
如果您比较的数据集大小合理,并且您在一个字段上进行比较,您可以将来自一个数据库的数据缓存在一个键控对象中,例如通用字典。然后,当您从第二个数据库读取数据时,您可以根据键从字典中获取详细信息并以这种方式执行比较。
您可以为一个数据库中的每条记录发出独立查询,以查看第二个数据库中是否存在匹配项,而不是嵌套读取器。
我正在解决一个类似的问题,并且使用 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();
卡洛斯·A·梅里赫。