在DataBase.cs里面
    public static SqlDataReader RunProcGetReader(string procName, SqlParameter[] prams)
    {
        SqlCommand Cmd = CreateCmd(procName, prams);
        SqlDataReader Dr = Cmd.ExecuteReader(CommandBehavior.CloseConnection);
        return Dr;
    }    public static SqlCommand CreateCmd(string procName, SqlParameter[] prams)
    {
        SqlConnection Conn = ReturnConn();
        SqlCommand Cmd = new SqlCommand();
        Cmd.CommandType = CommandType.StoredProcedure;
        Cmd.Connection = Conn;
        Cmd.CommandText = procName;
        if (prams != null)
        {
            foreach (SqlParameter parameter in prams)
            {
                if (parameter != null)
                {
                    Cmd.Parameters.Add(parameter);
                }
            }
        }
        return Cmd;
    }
在USER.CS类文件GetUser(int userid)函数里面
public SqlDataReader GetUser(int userid)
    {
        string procname = "dbo.GetUserinfo";
        SqlParameter[] prams = { new SqlParameter("@TableName", SqlDbType.INt) };
        prams[0].Value = userid;
        SqlDataReader sr = new DataBase().RunProcGetReader(procname, prams);
        return sr;
    }在用户管理页面user_manage.aspx.cx调用GetUser()函数获得一个SqlDataReader。因为“CommandBehavior.CloseConnection”的原因,如果在GetUser里面关闭sr的话,conn同时也会关闭。但是现在在user_manage.aspx.cx页面SqlDataReader sr2 = new USER().GetUser(this.userid),最后关闭sr2.close(),等于传递多了一步,这样conn会关闭吗,如何进行测试?

解决方案 »

  1.   

    真服了你了,这个SqlDataReader被你倒了几手啊!
    SqlDataReader 已经被你当作 dataset,datatable等当作数据容器来用了。
    在RunProcGetReader中,你已经将数据读入SqlDataReader Dr,并且返回,这时候RunProcGetReader释放资源,就已经将引用中的CreateCmd的资源也自动释放了。SqlDataReader 已经成为你的脱机数据读取载体。
      

  2.   

    conn会关闭。最好将Conn做成静态的属性。在调用时判断Conn是否关闭如果关闭则打开,在调用GetUser方法。