我如何通过阅读器读取我的数据

本文关键字:读取 我的 数据 何通过 | 更新日期: 2023-09-27 18:14:20

我正在尝试从数据阅读器读取,但我得到错误"当阅读器关闭时无效尝试调用read "。存储过程工作正常,但当我尝试从数据读取器读取时,它会抛出错误。请帮帮我

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();
        }
    }

我如何通过阅读器读取我的数据

我觉得这是个坏主意:

Session["Task_List"] = reader;

执行该操作并然后再次调用 reader.Read(),直到没有东西可读为止。假设您还会在某个点关闭阅读器(我希望-理想情况下使用using语句)。从根本上说,SqlDataReader是一个连接的资源-它就像一个流到数据库。它不是你应该保持比你需要更长时间的东西,它是当然不是你应该放在会话中的东西,即使你没有有效地使它与随后的Read()调用无效。

我假设数据绑定通过在调用DataBind()时获取数据来工作,但是没有指示通过将对阅读器本身的引用放入会话中来尝试实现什么。

我建议:

  • 隔离这是与会话还是与数据绑定有关
  • 如果它是会话,你拉出所有你需要的数据(例如到DataTable或其他一些"断开连接"的形式)
  • 如果是数据绑定,您将需要做类似的事情-但正如我所说,您可以希望这不是问题,开始-我假设您在其他地方看到过这种数据绑定?
此外,您应该考虑为什么要循环—目前您基本上要循环遍历所有结果,并且只显示最后一个(因为每次都覆盖数据绑定)。这是你想要的吗?

检查DNDatabase。executestoredproceurereader代码可能会在fetchdata之后关闭reader另外我要说的是:你不能使用Session["Task_List"] = reader;因为读者是向前的如果你想保持reader在一个session中的当前值加载到数据表中并保持表的数据行

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

你的方法executestoredproceurereader有一个finally语句来关闭连接。因此你不能从读者那里读到任何东西。要么关闭调用executestoredproceurereader的方法中的读取器,要么合并这两个方法,使它们在一个方法中。