关闭SqlConnection是否会自动释放SqlCommand和SqlDataReader资源
关于SqlConnection嵌套using资源释放的问题解答
核心结论
仅为SqlConnection添加using语句的写法不推荐,无法同步释放关联的SqlCommand和SqlDataReader资源,推荐使用多层嵌套using的标准写法。
具体说明
using语句的本质是自动调用实现了IDisposable接口对象的Dispose()方法,每个对象的Dispose仅负责释放自身持有的资源,不会主动处理关联的其他独立可释放对象的资源。- 仅释放
SqlConnection时,只会关闭数据库连接、将连接回收至连接池,不会清理SqlCommand持有的参数缓存、命令上下文,也不会释放SqlDataReader持有的结果集流、服务端游标等非托管资源,这些资源只能等到垃圾回收时被动清理,高并发场景下极易引发性能下降甚至资源泄漏。 - 你给出的第二种嵌套using写法是官方推荐的最佳实践,C# 8及以上版本还可以使用更简洁的using声明语法,省略多余的大括号层级:
using SqlConnection connection = new SqlConnection("connection string"); connection.Open(); using SqlCommand cmd = new SqlCommand("SELECT * FROM SomeTable", connection); using SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { // 执行业务逻辑 }
- 额外提示:
cmd.ExecuteReader()不会返回null,代码中的null判断属于冗余逻辑,可以直接删除。
内容的提问来源于stack exchange,提问作者Josy Sclei
相关产品推荐
相关产品推荐

