大家在使用SqlDataReader查询语句的时候,都会有遇到释放连接的问题。甚至如果频繁对数据库使用此查询语句时,则会“超时间时间已到。在操作完成之前超时时间已过或服务器未响应”的问题,其实这是由于数据库的连接数超过了连接池的最大值。由于在SqlDataReader查询语句有返回查询值,所以不能用using去解决这个问题。为此微软为SqlDataReader提供了一个属性,专门用来解决SqlDataReader的连接释放问题。如下:
/// <summary> /// 用来查询记录,以SqlDataReader对象形式返回 /// </summary> /// <param name="sql">用来查询的sql语句</param> /// <returns>返回一个SqlDataReader对象</returns> public SqlDataReader GetRow(string sql) { //创建数据库连接 SqlConnection con = CreateCon(); //打开数据库连接 con.Open(); //创建SqlCommand对象 SqlCommand com = new SqlCommand(sql, con); //返回ExecuteReader方法返回的DataReader对象 //这个属性就是用来当调用的地方释放连接即可将此处的申请的连接进行释放 SqlDataReader sdr = com.ExecuteReader(CommandBehavior.CloseConnection); return sdr; }
以上是创建连接的代码,在最后面加入CommandBehavior.CloseConnection这个属性后,使其在调用的地方对reader进行释放,即可关闭连接如下
public void KQGeteareaname(string Loginname) { string sql = "select KQKH_groupName,KQKH_areaName,KQKH_logUserPass,KQKH_IfFileDown from KQKH_logTable where KQKH_logUserName='" + Loginname + "'";
//SQLoperate 是一个数据库的操作类 SQLoperate sqloperate = new SQLoperate(); //使用using在使用玩sdr后,对其进行释放,从而关闭了数据库的连接 using (SqlDataReader sdr = sqloperate.GetRow(sql)) { sdr.Read(); KQgroupaname = sdr["KQKH_groupName"].ToString(); KQareaname = sdr["KQKH_areaName"].ToString(); IfFileDown = (bool)sdr["KQKH_IfFileDown"]; KQpassword = sdr["KQKH_logUserPass"].ToString(); } }
经验证,这样就可以关闭数据库的连接了