下面是一个类。程序调用一次setonline()函数后连接池就增加一个,没有关闭大家帮忙看看,程序有什么问题?
using System;
using System.Data;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;namespace textweb
{
/// <summary>
/// Summary description for Class1.
/// </summary>
public class Class1
{
public SqlConnection SqlConnection1; 
public SqlCommand SqlCommand1;
// public SqlDataAdapter SqlDataAdapter1;
// public SqlDataAdapter SqlDataAdapter2;
public SqlDataReader SqlDataReader1;
// public SqlCommandBuilder SqlCommandBuilder1;
public DataSet DataSet1;
public DataTable DataTable1;
public DataRow DataRow1;
public Class1()
{
//
// TODO: Add constructor logic here
//
}
public void ConnOpen()
{   
SqlConnection1 = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["Connstring"]);
try
{
//打开数据库的连接
SqlConnection1.Open();
}
catch(Exception ex)
{
throw new Exception("数据库连接失败!",ex);
}
} public void ConnClose()
{
// if (DataSet1 != null)
// {
// DataSet1.Clear();
// }
if (SqlConnection1 != null)
{
SqlConnection1.Close();
}
} public SqlDataReader GetSingleRecord (string sSQL)
{
ConnOpen();
//istrue=false;
SqlCommand1 = new SqlCommand(sSQL, SqlConnection1);
//SqlCommand1.Dispose();]
SqlDataReader dr;
try
{
dr =SqlCommand1.ExecuteReader();
}
catch(Exception ex)
{
throw new Exception("命令行执行失败!"+sSQL,ex);
}
SqlCommand1.Dispose();
return dr;
}
public string setonline()
{
string strsql="select * from section where sectionid=2";
SqlDataReader dr,dr2;
dr=GetSingleRecord(strsql);
if(dr.Read())
{
string bb=dr["sectionname"].ToString();
strsql="select * from section where sectionid=5";
dr2=GetSingleRecord(strsql);
dr2.Read();
bb+="|"+dr2["sectionname"].ToString();
dr2.Close();
dr.Close();
ConnClose();
return bb;
}
else
{
dr.Close();
ConnClose();
return "错误科室";
}
}
}
}

解决方案 »

  1.   

    你忘记关闭连接了,没有适配器的情况下要自己关闭连接
    你可以在最后的else后面添加dr.Close();ConnClose();2句,在这里就可以了不过推荐用using(){}语法保证资源的及时释放。
    或者用try{}finally{}语法。自己管理连接的时候,你这么写程序不太好,尽量把打开和关闭放在一起,哪怕你分别做了方法,这2个方法也要养成“成对使用”的习惯。
      

  2.   

    dr.Close()这样就可以对SqlDataReader进行关闭呀!释放内存空间
      

  3.   

    不好意思,刚才没看仔细,我又看了一下,你这个程序应该不能正常运行的才对。
    在第2次调用GetSingleRecord的时候,因为对一个已经打开的连接对象再次打开会有异常抛出,这个异常被你捕获为“数据库连接失败”。而且即使你再加个状态判断,因为Reader对象对连接的独占使用,你执行ExecuteReader的时候依然会抛出异常。所以建议你既然要递归使用,还是老老实实用using(){}语法吧。