我自己写了一个类,用来处理各种查询,类的构造函数就是连接数据库,conn是在web.config中写好的连接字符串。
现在的问题是:网站用了一段时间就会出现数据库连接超时的错误,后来查了查,应该是SqlConnection没有关闭,但是像如下代码应该如何关闭连接呢。我曾经想过把 connStr = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["conn"].ToString());
connStr.Open();放到static函数中,然后每次生成类的时候,查询connstr是否为空,如果不为空再连接。但我觉得这样还是不够理想,请各位老师多提宝贵意见,谢谢!代码结构如下,
===================================================
public class sqldata
{
private SqlConnection connStr;
public SqlCommand cmd;
private SqlDataReader dr; public sqldata()
{
//
// TODO: 在此处添加构造函数逻辑
//
connStr = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["conn"].ToString());
connStr.Open();
} public SqlDataReader getUserName(int userID)
{
cmd = new SqlCommand("getUserName", connStr);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@userID", userID);
dr = cmd.ExecuteReader();
//connStr.Close();<--这个地方关闭了连接,那返回的dr也没有内容了应该如何正确的关闭连接呢?
return dr;
}
// 。等等都是一些返回SqlDataReader的函数选择正确的时间和地点关闭连接?这真是一个困扰我等菜鸟的问题,在线等大家的经验之谈,看我这段代码,或者这个类应该如何重写。
解决方案 »
- 为了她 但我不会 设计一个ASP程序,实现学生信息查询,要求根据姓名进行查询(支持模糊查询),无查找条件时,显示全部数据信息。
- 想让系统给多日未登入的用户发邮件,该怎么做。
- 花生壳问题?
- flash导航条一般是怎么动态增加栏目的?
- asp.net 用xml作数据源 更新不了数据
- [c#][webservice] Error:Client found response content type of text/html; .....
- 在DataList中控件显示的问题!
- 如何让Datagrid固定大小?
- 请问如何把datagarid里的数据导成excel
- 求助:我创建asp项目的时候,提示说“web服务器运行的不是asp.net 1.1版本”
- aspx页面自定义快捷键
- 实现这个,有多少种解决方案?页面数据实时刷新
{
connStr.Open();
}
不用担心连接会完全回收掉,会放到连接池里缓存一段时间。
/// <summary>
/// 类,用于数据访问的类。
/// </summary>
public class Database : IDisposable
{
/// <summary>
/// 保护变量,数据库连接。
/// </summary>
protected SqlConnection Connection; /// <summary>
/// 保护变量,数据库连接串。
/// </summary>
protected String ConnectionString; /// <summary>
/// 构造函数。
/// </summary>
/// <param name="DatabaseConnectionString">数据库连接串</param>
public Database()
{
ConnectionString = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString();
//ConnectionString = ConfigurationManager.ConnectionStrings["PublishDB"].ToString(); } /// <summary>
/// 析构函数,释放非托管资源
/// </summary>
~Database()
{
try
{
if (Connection != null)
{
Connection.Close();
}
}
catch (Exception ex)
{
Logger.Log.Error("数据库链接错误:", ex);
}
try
{
Dispose();
}
catch { }
} /// <summary>
/// 保护方法,打开数据库连接。
/// </summary>
protected void Open()
{
if (Connection == null)
{
Connection = new SqlConnection(ConnectionString);
}
if (Connection.State.Equals(ConnectionState.Closed))
{
Connection.Open();
}
} /// <summary>
/// 公有方法,关闭数据库连接。
/// </summary>
public void Close()
{
if (Connection != null)
Connection.Close();
} /// <summary>
/// 公有方法,释放资源。
/// </summary>
public void Dispose()
{
// 确保连接被关闭
if (Connection != null)
{
Connection.Dispose();
Connection = null;
}
} /// <summary>
/// 公有方法,获取数据,返回一个SqlDataReader (调用后主意调用SqlDataReader.Close())。
/// </summary>
/// <param name="SqlString">Sql语句</param>
/// <returns>SqlDataReader</returns>
public SqlDataReader GetDataReader(String SqlString)
{
Open();
SqlCommand cmd = new SqlCommand(SqlString, Connection);
SqlDataReader dataReader = null;
try
{
dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
}
catch (Exception ex)
{
Logger.Log.Error("GetDataReader错误:", ex);
}
return dataReader;
} /// <summary>
/// 公有方法,获取数据,返回一个DataSet。
/// </summary>
/// <param name="SqlString">Sql语句</param>
/// <returns>DataSet</returns>
public DataSet GetDataSet(String SqlString)
{
Open();
DataSet dataset = new DataSet();
try
{
SqlDataAdapter adapter = new SqlDataAdapter(SqlString, Connection);
adapter.Fill(dataset);
Close();
}
catch (Exception ex)
{
Logger.Log.Error("GetDataSet错误:", ex);
}
return dataset;
}
使用CommandBehavior.CloseConnection