我用ASP.NET制作的一个登录页面,查询用户名和密码,返回用户部门及权限等许多信息。
将登录查询封装在类中。返回SqlDataReader
代码如下    public SqlDataReader login(string uname,string password)
    {
        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["QJCC"].ConnectionString);
        SqlCommand cmd = new SqlCommand("login_staff", con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("@s_name", SqlDbType.VarChar, 50).Value = uname;
        cmd.Parameters.Add("@s_password", SqlDbType.VarChar, 16).Value = password;
        con.Open();
        try
        {
            SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            return dr;
        }
        catch (Exception err)
        {
            throw new System.Exception(err.Message);
        }
        finally
        {
            cmd.Dispose();
        }
    }login.aspx中调用,代码如下:    protected void btn_login_Click(object sender, EventArgs e)
    {
        string uname = this.tname.Text.Trim().ToString();
        string upass = FormsAuthentication.HashPasswordForStoringInConfigFile(this.tpass.Text.Trim().ToString(), "MD5");
        Staff staff_login = new Staff();
        SqlDataReader dr_staff = staff_login.login(uname, upass);
        if (dr_staff.Read())
        {
            int s_status = Convert.ToInt32(dr_staff["s_status"].ToString());
            if (s_status != 1)
            {
                Response.Write("<script>alert('该员工已经离职,登录失败!')</script>");
            }
            else
            {
                
                Session["uname"] = uname;
                if (Session["uname"].ToString() != "")
                {
                    Session["staffid"] = Convert.ToInt32(dr_staff["s_id"].ToString());
                }
                else
                {
                    Session["staffid"] = 0;
                }
                Session["position"] = dr_staff["p_name"].ToString();
                if (Session["position"].ToString() != "")
                {
                    Session["positionid"] = Convert.ToInt32(dr_staff["p_positionid"].ToString());
                }
                else
                {
                    Session["positionid"] = 0;
                }
                Session["department"] = dr_staff["d_name"].ToString();
                if (Session["department"].ToString()  != "")
                {
                    Session["departmentid"] = Convert.ToInt32(dr_staff["d_departmentid"].ToString());
                }
                else
                {
                    Session["departmentid"] = 0;
                }
                Session["group"] = dr_staff["g_name"].ToString();
                if (Session["group"].ToString() != "")
                {
                    Session["groupid"] = Convert.ToInt32(dr_staff["g_groupid"].ToString());
                }
                else
                {
                    Session["groupid"] = 0;
                }
                dr_staff.Close();
                Response.Redirect("index.aspx");
            }
        }
        else 
        {
            dr_staff.Close();
            Response.Write("<script>alert('用户名或密码错误!')</script>");
        }
    }我在ExecuteReader执行时使用了CommandBehavior.CloseConnection,并关闭了dr_staff.Close();
为什么我用SP_who查询,发现连接池中连接.Net Sqlclient Data Provider仍然存在。只是Status为sleeping
Command为AWAITING COMMAND。即使关闭了页面,这个连接也要过几分钟才释放。
这样的话,100台以上的机器登录网页,连接池不就不够用了?
还是说sleeping的连接已经释放了?
公司几千人,请问怎样释放连接?
还有,关闭网页的时候怎么强制关闭连接?

解决方案 »

  1.   

    搞错了,应该是不正常。看看这个网址,看看有没有未正常关闭的连接
     http://www.netortech.com/Blog/Entry/3/Searching-out-connection-leaks-in-Microsoft-SQL
      

  2.   

    是不是条件分支语句没有覆盖到?尝试把dr_staff.Close();放到代码的最后,保证其执行。
      

  3.   

    关闭了,我测试了其他的close(),sp_who中都能查到sleeping的连接!
      

  4.   

    1 如果发生了异常,那么你的con就没有close
    2 你的分支里面有问题,没有覆盖到。 if (s_status != 1) 里面就没有关闭
      

  5.   


    没测试过。close之后sp_who 还能查到连接?
    那dispose 之后看看还有吗?
      

  6.   

    确实是。但是我调试时看到datareader关闭的。还是能查到sleeping的连接!