【问题标题】:How do i read my data through reader?我如何通过阅读器读取我的数据?
【发布时间】:2011-11-14 07:23:32
【问题描述】:

我正在尝试从 datareader 读取,但我收到错误“读取器关闭时调用 Read 的尝试无效。”存储过程工作正常,但是当我尝试读取 fom datareader 时,它会抛出错误。请帮助我

protected void CheckDatabase()
    {
        SqlConnection conn = new SqlConnection(GetConnectionString());
        conn.Open();
        SqlParameter[] param = new SqlParameter[2];
        param[0]= new SqlParameter("@EmpID", SqlDbType.Int);
        param[0].Value = txtEmpId.Text;
        param[1]= new SqlParameter("@Date", SqlDbType.VarChar,50);
        param[1].Value = txtDate.Text;
        SqlDataReader reader = DNDatabase.ExecuteStoredProcedureReader("RetrieveDeatails", param);
        while (reader.Read())
        {
            gridConfirm.DataSource = reader;
            gridConfirm.Columns[0].Visible = false;
            gridConfirm.DataBind();
                Session["Task_List"] = reader;

        }}

这里是存储过程代码

public static SqlDataReader ExecuteStoredProcedureReader(string procedureName, SqlParameter[] parameters)
    {

        SqlConnection _conn = new SqlConnection(DNDatabase.SQLConnectionString);
        SqlCommand cmd = new SqlCommand(procedureName, _conn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = procedureName;
        cmd.CommandTimeout = 300;
        try
        {

            foreach (SqlParameter param in parameters)
            {
                cmd.Parameters.Add(param);
            }
            _conn.Open();

            return cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }
        catch (Exception sqlExc)
        {
            throw new Exception("An error occured", sqlExc);
        }
       finally
        {
            if (_conn != null)
                _conn.Close();
        }
    }

【问题讨论】:

  • 如果不知道 DNDatabase.ExecuteStoredProcedureReader 长什么样,就很难判断。

标签: c# asp.net


【解决方案1】:

这对我来说似乎是个坏主意:

Session["Task_List"] = reader;

您执行该操作并然后再次调用reader.Read(),继续直到没有任何内容可供阅读。大概你也会在某个时候关闭读者(我希望 - 理想情况下使用using 声明)。从根本上说,SqlDataReader 是一个已连接 资源——它就像一个流向数据库的流。这不是你应该坚持的时间超过你需要的东西,而且它当然不是你应该在会话中放置的东西,即使你没有通过随后的 Read() 有效地使其无效打电话。

我假设数据绑定通过在您调用 DataBind() 时获取数据来工作,但没有迹象表明您通过将阅读器本身的引用放入会话中来实现什么。

我建议:

  • 您确定这实际上是与会话还是数据绑定有关
  • 如果是会话,您可以提取所有需要的数据(例如,放入 DataTable 或其他“断开连接”的表单)
  • 如果是数据绑定,您需要做类似的事情 - 但正如我所说,您可以希望这不是问题,首先 - 我假设您看到了这种数据绑定其他地方?

此外,您应该考虑为什么要循环 - 目前您基本上要循环所有结果,并且只会显示 last 一个(因为您正在覆盖每次数据绑定)。这真的是你想要的吗?

【讨论】:

  • 我在从那里删除会话后也尝试过,但遇到了同样的问题..我只是想要数据绑定,然后我需要在其他地方检索数据...... ..
  • @mona:因此,您实际上需要将SqlDataReader 中的数据获取 转换为您想要的任何形式。我建议您将其加载到强类型对象或集合中,然后绑定到该对象并将该对象放入会话或其他任何内容中。
【解决方案2】:

检查 DNDatabase.ExecuteStoredProcedureReader 代码可能会在 fetchdata 后关闭阅读器 我要说的另一件事是: 你不能使用 Session["Task_List"] = reader;因为 reader 是 forwardonly 并且如果您想在数据表中保持阅读器的当前值并保持表的数据行

DataTable dt = new DataTanle(); dt.负载(博士); 并循环遍历数据表行

【讨论】:

    【解决方案3】:

    您的方法 ExecuteStoredProcedureReader 有一个 finally 语句来关闭连接。因此,您无法从读者那里阅读任何内容。要么在调用 ExecuteStoredProcedureReader 的方法中关闭阅读器,要么将这两种方法合并到一个方法中。

    【讨论】:

      猜你喜欢
      • 2015-07-10
      • 1970-01-01
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多