我用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的连接已经释放了?
公司几千人,请问怎样释放连接?
还有,关闭网页的时候怎么强制关闭连接?
将登录查询封装在类中。返回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的连接已经释放了?
公司几千人,请问怎样释放连接?
还有,关闭网页的时候怎么强制关闭连接?
解决方案 »
- 求助:第一天上班,有什么要注意的!
- 设计中数据依赖的问题
- VS2005中用建立的网站,如果后台自动运行?
- 判断服务器上的文件是否存在
- dropdownlist 和 listbox 中,能不能允许用户自己在控件中写入文本?
- 急求paypal接口的源码
- 求救!!!“ssss/r/nsssss(char(13)+char(10))ss<br>sssss/rsss“这么样让它换行写入文件啊?
- 用HyperLink控件 点击之前怎么跳出个提示窗体 ?
- 出现如下错误,请问各位如何解决呀,是哪里的问题呀。
- c# word 根据模版导出word文档
- 如何在web service中输出纯json的数据?
- Asp.net的怪现象。
http://www.netortech.com/Blog/Entry/3/Searching-out-connection-leaks-in-Microsoft-SQL
2 你的分支里面有问题,没有覆盖到。 if (s_status != 1) 里面就没有关闭
没测试过。close之后sp_who 还能查到连接?
那dispose 之后看看还有吗?