一尘不染

SqlConnection SqlCommand SqlDataReader IDisposable

c#

SqlConnectionSqlCommand并且SqlDataReader全部实现该IDisposable接口。我读到最好的做法总是包裹IDisposablesusing块。

因此,我用于查询数据的常见方案如下所示(当然,在更大的上下文中,像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块的级别不确定,但是我当然想以正确的方式来做。谢谢!


阅读 343

收藏
2020-05-19

共1个答案

一尘不染

这是100%正确的方法。如果使用一个类IDisposable,则应将其包装在一条using语句中以确保Dispose()调用该方法。此外,与诸如SQL
Server之类的不受管理的外部技术进行通信也不应该掉以轻心。该SqlCommand对象的实现IDisposable有很好的理由。下面的代码是Dispose()SqlCommand对象的方法:

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this._cachedMetaData = null;
    }
    base.Dispose(disposing);
}

如您所见,它将释放对该_cachedMetaData对象的引用,以便也可以对其进行清理。

2020-05-19