0

我有以下代码:

if (reader.HasRows)
{
    while (reader.Read())
    {
        DataRow searchedDR = ds.Tables[dr["name"].ToString()].Rows.Find(reader["ID"].ToString());
        if (searchedDR != null)
            ds.Tables[dr["name"].ToString()].Rows.Remove(searchedDR);
    }
}

当这块代码成功完成后,数据读取器(reader)变空了?是什么原因?之后我需要与这位读者合作。解决办法是什么?

4

5 回答 5

4

数据阅读器是数据的软管。当您使用它正在读取的所有数据时,它变得“空”(或者更好的类比:干涸)。

它不是存储设备(不是存储桶)。如果您之后想要数据,请将其存储在某个地方 -DataTable例如,一个或一个类模型。

于 2010-01-30T13:57:30.780 回答
3

IDataReader定义了一个只读的、只转发的数据提供者。一旦调用该Read()方法,就无法返回上一行。由于接口没有提供任何Reset()方法,唯一的重新开始的方法是再次执行数据库命令。把阅读器想象成一个数据流——你可以要求下一行,但是一旦阅读,它就消失了。

如果需要多次遍历数据库查询的结果,则需要将结果缓存在应用程序内存中。您可以手动执行此操作,对阅读器进行初始传递,但使用 an 会更容易IDataAdapter

于 2010-01-30T13:57:19.583 回答
1

取决于将产生多少数据。如果不是很多,您可以使用阅读器将数据读入临时数据结构,然后为您的两个操作迭代数据结构。如果有太多数据无法有效地将其全部保存在内存中,那么您别无选择,只能创建一个新的数据读取器并重新执行该命令。

于 2010-01-30T13:58:58.510 回答
1

DataReader 是只进的,你不能退后一步。它旨在用于快速、单向的数据读取操作。

如果之后需要处理数据,则必须使用已将数据复制到的 DataTable,或重新初始化它。

于 2010-01-30T14:00:42.763 回答
1

DataReader是从数据库查询返回的数据流。执行查询时,第一行通过流返回给 DataReader。流然后保持连接到数据库,准备检索下一条记录。DataReader 一次从数据库中读取一行,并且一次只能向前移动一条记录。当 DataReader 从数据库中读取行时,可以读取和评估每行中的列的值,但不能对其进行编辑。

通常我们使用 datareader ado.net 控件,我们不需要像绑定下拉菜单或数据转发器控件那样转到上一行。为了保持轻量级,微软只支持数据读取器控制中的转发功能。

之后要使用它,请使用DataTable或创建一个保留内容的自定义类。

来源: http ://www.techbaba.com/q/2758-why+datareader+forward+only.aspx

于 2010-01-30T14:01:08.500 回答