【问题标题】:When DataReader become empty?DataReader 何时变空?
【发布时间】:2010-01-30 13:52:41
【问题描述】:

我有以下代码:

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)变空了? 是什么原因? 之后我需要与这位读者合作。解决办法是什么?

【问题讨论】:

    标签: c# sqldatareader datareader


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      IDataReader 定义了一个只读、只转发的数据提供者。一旦调用了Read() 方法,就无法返回上一行。由于接口没有提供Reset()方法,唯一的重新开始的方法是再次执行数据库命令。将阅读器视为数据流 - 您可以请求下一行,但一旦读取,它就消失了。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

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

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

            之后要使用它,可以使用 DataTable 或创建一个自定义类来保存内容。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-02-12
              • 1970-01-01
              相关资源
              最近更新 更多