我有以下代码:
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);
}
}
当这段代码成功完成时,数据阅读器(阅读器)变空了? 是什么原因? 之后我需要和这个读者一起工作。解决方案是什么?
答案 0 :(得分:4)
数据读取器是数据的软件。当你消耗它正在读取的所有数据时,它变得“空”(或者更好的类比:干涸)。
它不是存储设备(它不是存储桶)。如果您想要以后的数据,请将其存储在某处 - 例如DataTable
或类模型。
答案 1 :(得分:3)
IDataReader
定义了只读前向数据提供程序。调用Read()
方法后,无法返回上一行。由于接口不提供Reset()
方法,因此重新开始的唯一方法是再次执行数据库命令。将读者视为数据流 - 您可以要求下一行,但一旦阅读,它就消失了。
如果需要多次遍历数据库查询的结果,则需要将结果缓存到应用程序内存中。您可以手动执行此操作在读者上进行初始传递,但使用IDataAdapter
会更容易。
答案 2 :(得分:1)
取决于要生成多少数据。如果不是很多,您可以使用阅读器将数据读入临时数据结构,然后迭代数据结构以进行两种操作。如果有太多的数据要将它全部保存在内存中,那么你别无选择,只能创建一个新的数据读取器并重新执行命令。
答案 3 :(得分:1)
DataReader只是前瞻性的,你不能退后一步。它适用于快速,单向的数据引导操作。
如果您之后需要处理数据,则必须使用已将数据复制到其中的DataTable,或重新开发数据。
答案 4 :(得分:1)
DataReader 是从数据库查询返回的数据流。执行查询时,第一行将通过流返回到DataReader。然后流保持连接到数据库,准备检索下一条记录。 DataReader一次从数据库中读取一行,并且只能向前移动,一次一条记录。当DataReader从数据库中读取行时,可以读取和评估每行中列的值,但不能对它们进行编辑。
通常我们使用datareader ado.net控件,我们不需要转到上一行,例如绑定下拉列表或数据转发器控件。为了保持轻量级,Microsoft支持仅转发datareader控件中的功能。
要在以后使用它,请使用 DataTable 或制作一个保留内容的自定义类。
来源: http://www.techbaba.com/q/2758-why+datareader+forward+only.aspx