有关C#里数据库连接释放的问题
如题,与数据库的连接进行SQL查询的方法,我们都希望能设计为一个公有的静态方法,然而在使用有返回结果的查询时,数据库的连接对象却不应该立即被释放掉。
以上方法执行一个带有返回值的SQL查询,查询后,为了使得该方法的结果SqlDataReader能够被调用者所继续使用,所以不能够在这个方法里使用using自动释放SqlConnection conn。
那么在调用者处的代码写为
这样可以确保立即释放SqlDataReader,但是这样能确保SqlConnection conn也被释放吗,如果SqlConnection conn没有被释放应该怎么做?
我是否可以设计一个结构(假设类名为Result),将conn和sdr放在一起同时作为Execute方法的返回值,然后在调用者的代码使用完sdr后,写
请问我这样的设计合理吗,还是说可以完全不用去管SqlConnection conn何时以及如何被释放呢,没记错的话这个叫非托管资源。
public static SqlDataReader Execute(String sql) {
SqlConnection conn = new SqlConnection(Constants.CONNECT_STRING);
using(SqlCommand cmd = new SqlCommand(sql, conn)) {
try {
conn.Open();
return cmd.ExecuteReader();
} catch(System.Data.SqlClient.SqlException ex) {
throw new Exception(ex.Message);
}
}
}以上方法执行一个带有返回值的SQL查询,查询后,为了使得该方法的结果SqlDataReader能够被调用者所继续使用,所以不能够在这个方法里使用using自动释放SqlConnection conn。
那么在调用者处的代码写为
SqlDataReader sdr = SQLHelper.Execute(sql);
// 使用sdr
sdr.Close();
sdr = null;
这样可以确保立即释放SqlDataReader,但是这样能确保SqlConnection conn也被释放吗,如果SqlConnection conn没有被释放应该怎么做?
我是否可以设计一个结构(假设类名为Result),将conn和sdr放在一起同时作为Execute方法的返回值,然后在调用者的代码使用完sdr后,写
Result ret = SQLHelper.Execute(sql);
// 使用ret.sdr
ret.sdr.Close();
ret.sdr = null;
ret.conn.Close();
ret.conn.Dispose();
ret.conn = null;
请问我这样的设计合理吗,还是说可以完全不用去管SqlConnection conn何时以及如何被释放呢,没记错的话这个叫非托管资源。
...全文
相关推荐
几种数据库连接
数据库连接是最麻烦的事情,想要做开发由不得不用
c#的mysql数据库连接池源码,已稳定运行多年
在ManagePool()里,可设定多少时间循环检查一次连接的有效性
C#中oracle连接数据库的封装类
C#中oracle连接数据库的封装类,有简短的说明
C#高效连接sql数据库 防sql 注入
C#高效连接sql数据库 只要打数据库连接 不要关闭 sql传参 防sql 注入
C#远程连接SQLserver 数据库
C#和ADO.NET是什么关系?为什么讲解C#连接数据库的资料里面普遍都讲的用ADO.NET技术连接数据库?这里读者仅需记住:用C#开发软件需要连接数据库时,尽管使用ADO.NET技术好了,不用考虑它们啥关系。


