SqlConnection,SqlCommand并且SqlDataReader全部实现该IDisposable接口。我读到最好的做法总是包裹IDisposables成using块。
SqlConnection
SqlCommand
SqlDataReader
IDisposable
IDisposables
using
因此,我用于查询数据的常见方案如下所示(当然,在更大的上下文中,像linq2sql这样的映射工具将是合适的,但是假设我们要在此处使用此方法):
using (SqlConnection cn = new SqlConnection("myConnectionstring")) { using (SqlCommand cm = new SqlCommand("myQuery", cn)) { // maybe add sql parameters using (SqlDataReader reader = cm.ExecuteReader()) { // read values from reader object return myReadValues; } } }
这是正确的方法还是可以认为是矫kill过正?我对此嵌套using块的级别不确定,但是我当然想以正确的方式来做。谢谢!
这是100%正确的方法。如果使用一个类IDisposable,则应将其包装在一条using语句中以确保Dispose()调用该方法。此外,与诸如SQL Server之类的不受管理的外部技术进行通信也不应该掉以轻心。该SqlCommand对象的实现IDisposable有很好的理由。下面的代码是Dispose()该SqlCommand对象的方法:
Dispose()
protected override void Dispose(bool disposing) { if (disposing) { this._cachedMetaData = null; } base.Dispose(disposing); }
如您所见,它将释放对该_cachedMetaData对象的引用,以便也可以对其进行清理。
_cachedMetaData