如何解决这个问题? “关闭阅读器后,无效尝试调用CheckDataIsReady”

时间:2019-04-10 02:53:48

标签: c# sqldatareader

我创建了一个构造函数方法来执行sqldatareader以避免重新键入sqlconnection,但是使用它时会出现错误:

public SqlDataReader ExecuteCommand(string cmdText, CommandType cmdType)
{
    SqlDataReader dr = null;
    using (SqlConnection conn = new SqlConnection(ConnString))
    {
        SqlCommand cmd = conn.CreateCommand();
        cmd.CommandText = cmdText;
        cmd.CommandType = cmdType;
        try
        {
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
                dr = cmd.ExecuteReader();
            }
        }
        catch(Exception e)
        {

        }
        finally
        {
            dr.Dispose();
            conn.Close();
        }
    }
    return dr;
}

我尝试使用它,但发生错误:

SqlDataReader dr = ExecuteCommand("Select * from EmployeeInfo where Employeeid = 2", CommandType.Text);
textBox1.Text = dr[1].ToString();

错误是:

  

关闭阅读器后,无效尝试调用CheckDataIsReady。

1 个答案:

答案 0 :(得分:1)

只需考虑程序的步骤:

functionName

首先,您正确打开连接并执行命令-一切正常!

destructor

接下来,您的代码到达了finally块-您(尝试)处置读取器并关闭连接!再次没有错。 接下来是您的问题:

try
{
   if (conn.State != ConnectionState.Open)
   {
      conn.Open();
      dr = cmd.ExecuteReader();
   }
}

您返回一个封闭的读取器,然后尝试从中读取它-这会导致您收到错误。 恕我直言,我想到了两种可能的解决方案:

  1. 不关闭阅读器就退还阅读器(选中此question
  2. 缓存阅读器结果并返回(在您的情况下为文本框的字符串)