我有一个功能模块,通过与acess数据打交道,在winform中进行应用操作。数据库操作层使用的是三层接口,即业务层、接口、持久层,业务层通过调用接口来进行操作数据库。另有一个factory工厂,通过配置文件来映射,为的是适应不同的数据库。我在持久层C中如下代码:
Class C.cs
public class C : IC
{
private static readonly string connecString = ConfigurationManager.AppSettings["ConnectionString"]; //数据库连接
OleDbConnection aConnection = null public TaskList()
{
aConnection = new OleDbConnection(connecString);
if (aConnection.State == ConnectionState.Closed) aConnection.Open();
}public IList<TaskListInfo> GetTaskListData(string sql)
{
OleDbCommand aCommand = new OleDbCommand("select * from " + TaskListInfo.tableName + sql, aConnection);
doSth……
}
}
然后我在winform里通过timer定时器,每隔0.2秒就调用GetTaskListData(),代码如下 private void timer2_Tick(object sender, EventArgs e)
{
try
{
C Task = new C();
IList<TaskListInfo> table = Task.GetTaskListData(" where FinishStatus = false");
}
catch (System.Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
每当定时器运行大概4分钟时,系统就会报错。后我思考再三,觉得可能是C类,在构造函数中进行了数据库连接,所以数据库连接过多造成的,于是我将C改成:
Class C.cs
public class C : IC
{
private static readonly string connecString = ConfigurationManager.AppSettings["ConnectionString"]; //数据库连接
public TaskList()
{
}public IList<TaskListInfo> GetTaskListData(string sql)
{
OleDbConnection aConnection = new OleDbConnection(connecString);
if (aConnection.State == ConnectionState.Closed) aConnection.Open()
doSth……
}
}
问题得以解决,但是我虽然改对了,却不明白其理,还请高手指点
Class C.cs
public class C : IC
{
private static readonly string connecString = ConfigurationManager.AppSettings["ConnectionString"]; //数据库连接
OleDbConnection aConnection = null public TaskList()
{
aConnection = new OleDbConnection(connecString);
if (aConnection.State == ConnectionState.Closed) aConnection.Open();
}public IList<TaskListInfo> GetTaskListData(string sql)
{
OleDbCommand aCommand = new OleDbCommand("select * from " + TaskListInfo.tableName + sql, aConnection);
doSth……
}
}
然后我在winform里通过timer定时器,每隔0.2秒就调用GetTaskListData(),代码如下 private void timer2_Tick(object sender, EventArgs e)
{
try
{
C Task = new C();
IList<TaskListInfo> table = Task.GetTaskListData(" where FinishStatus = false");
}
catch (System.Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
每当定时器运行大概4分钟时,系统就会报错。后我思考再三,觉得可能是C类,在构造函数中进行了数据库连接,所以数据库连接过多造成的,于是我将C改成:
Class C.cs
public class C : IC
{
private static readonly string connecString = ConfigurationManager.AppSettings["ConnectionString"]; //数据库连接
public TaskList()
{
}public IList<TaskListInfo> GetTaskListData(string sql)
{
OleDbConnection aConnection = new OleDbConnection(connecString);
if (aConnection.State == ConnectionState.Closed) aConnection.Open()
doSth……
}
}
问题得以解决,但是我虽然改对了,却不明白其理,还请高手指点
使用不同数据库,配置
<add key="DALClass" value="SqlDBOperator"/>
<add key="DBClass" value="SqlDataAccess"/>
public interface IDBOperator
{}
继承
你不妨在 class C 的构造函数,析构中 作个标记,看它是否及时释放。
如果没有及时释放 ,那你的答案就有了。