建议不要使用DataReader作为返回值,用完datareader后及时关闭

解决方案 »

  1.   

    你看到了。我再用完之后及时关闭了,datareader的读取速度快我又使用dropdownlist读取数据所以…………我也非常想弄明白问题所在。
      

  2.   

    奇怪,我也用DATAREADER啊,听好的,没出现你这问题啊
      

  3.   

    行 31:  }
    行 32: 
    行 33:  SqlDataReader sqlDR = sqlCmd.ExecuteReader();
    行 34: 
    行 35:  return sqlDR;源文件: d:\hbj2003\dbobject\protectweb.cs    行: 33 
    // 返回表Accounts_Users的所有数据,提供下拉菜单的数据绑定。
    public SqlDataReader sqlDRUsers()
    {
    string strSql ="SELECT * FROM Accounts_Users";
    SqlCommand sqlCmd = new SqlCommand(strSql,Conn);

    if (Conn.State == ConnectionState.Closed)
    {
    Conn.Open();
    } SqlDataReader sqlDR = sqlCmd.ExecuteReader(); return sqlDR;
    }是类库中的。我昨天用时没发现问题。今天添加了:
    public SqlDataReader sqlDRRoles()
    // {
    // string sqlStr = "SELECT * FROM Accounts_Roles";
    // SqlCommand sqlCmd = new SqlCommand(sqlStr,Conn);
    //
    // if (Conn.State == ConnectionState.Closed)
    // {
    // Conn.Open();
    // }
    //     SqlDataReader sqlDR = sqlCmd.ExecuteReader();
    //
    // return sqlDR;
    // }
    }
    导致错误,然后我添加了状态监测if (Conn.State == ConnectionState.Closed)无效。注释后导致以上错误!!
      

  4.   

    改成这样呢?
    if(vConnection.State!=ConnectionState.Open)
    {
    Conn.Open();
    }
      

  5.   

    Conn.Open()前重新对Conn连接串赋值呢?就是Conn.ConnectionString="....."
      

  6.   

    找出以前跟Conn联系的DataReader,DataReader.Close();
    或者Conn.Close()先再Conn.Open();
      

  7.   

    Conn打开时,采用和Datareader同时打开和关闭的方式,即Datareader关闭,Conn也关闭。
      

  8.   

    解决了。我终于搞清了问题所在。
    在类的内部sqldatareader是打开的并没有关闭。在类的外部强行关闭会导致出现的问题。解决办法:sqldatareader sqlDR = sqlCmd.exectuereader(commandbehavior.closeconnection);虽然只是这一条语句,却在外部调用的时候自动关闭了(connection.close()).我用state测试过,不明白原理。