c# mysql sdr_有关C#里数据库连接释放的问题

本文讨论了如何在设计公有静态方法执行SQL查询时,避免因返回SqlDataReader导致的SqlConnection过早释放。作者提出将连接与结果集封装成Result类,以便于正确管理资源。同时探讨了非托管资源的释放问题和合理的设计方案。
摘要由CSDN通过智能技术生成

如题,与数据库的连接进行SQL查询的方法,我们都希望能设计为一个公有的静态方法,然而在使用有返回结果的查询时,数据库的连接对象却不应该立即被释放掉。

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何时以及怎么样被释放呢,没记错的话这个叫非托管资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值