首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确处理DbConnection

正确处理DbConnection
EN

Stack Overflow用户
提问于 2008-12-22 17:09:54
回答 4查看 8.8K关注 0票数 2

我有一个包装DbConnection的名为DatabaseHelper的类。为using语句设置此类的正确方法是什么?我已经实现了IDisposible,但我不确定应该在何时何地调用Connection.Close()或Connection.Dispose()。

当我只是在自己的Dispose()方法中调用Connection.Dispose()时,有时会从我的DbConnection对象中获得一个SocketException。我认为这是因为旧的连接是开放的,但没有附加到异常的细节,所以我不能确定。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-12-22 17:13:09

从dispose方法中调用connection.Dispose()。您应该看看实现IDisposable的标准模式,它超越了简单地实现IDisposable接口,并允许部署非托管对象等:

代码语言:javascript
复制
public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
    if (!disposed)
    {
        if (disposing)
        {
            // Dispose managed resources.
        }

        // There are no unmanaged resources to release, but
        // if we add them, they need to be released here.
    }
    disposed = true;

    // If it is available, make the call to the
    // base class's Dispose(Boolean) method
    base.Dispose(disposing);
}

(摘自http://msdn.microsoft.com/en-us/library/system.idisposable.aspx)。

票数 6
EN

Stack Overflow用户

发布于 2008-12-22 17:18:33

this新闻组报道:

下面是IDbConnection.Dispose()的实现方式(如反射器工具所示):

SqlClient:

代码语言:javascript
复制
protected override void Dispose(bool disposing)
{
       if (disposing)
       {
             switch (this._objectState)
             {
                   case ConnectionState.Open:
                   {
                         this.Close();
                         break;
                   }
             }
             this._constr = null;
       }
       base.Dispose(disposing);
}

Odbc:
protected override void Dispose(bool disposing)
{
       if (disposing)
       {
             this._constr = null;
             this.Close();
             CNativeBuffer buffer1 = this._buffer;
             if (buffer1 != null)
             {
                   buffer1.Dispose();
                   this._buffer = null;
             }
       }
       base.Dispose(disposing);
}

OleDb:
protected override void Dispose(bool disposing)
{
       if (disposing)
       {
             if (this.objectState != 0)
             {
                   this.DisposeManaged();
                   if (base.DesignMode)
                   {
                         OleDbConnection.ReleaseObjectPool();
                   }
                   this.OnStateChange(ConnectionState.Open, ConnectionState.Closed);
             }
             if (this.propertyIDSet != null)
             {
                   this.propertyIDSet.Dispose();
                   this.propertyIDSet = null;
             }
             this._constr = null;
       }
       base.Dispose(disposing);
}

dispose方法应仅在连接处于打开状态时尝试关闭该连接。

票数 2
EN

Stack Overflow用户

发布于 2013-07-04 16:11:51

这个析构函数语法实际上就是终结器。终结器正在调用Dispose(false)方法。

代码语言:javascript
复制
    #region IDisposable Members
    private bool _isDisposed;

    private void ThrowIfDisposed()
    {
        if (_isDisposed)
            throw new ObjectDisposedException(this.GetType().Name);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!_isDisposed)
        {
            if (disposing)
            {
                //part 1 : disposing managed objects
                _command.Dispose();
                _command.Connection.Dispose();
                if (_command.Transaction != null)
                    _command.Transaction.Dispose();
            }
            //part 2: disposing unmanged objects. Here there are no unmanged objects.
            _isDisposed = true;
        }
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    //~DbCommandExecutor() //No need of finalize here. Because there is no unmanged objects in my class. ie, no code in part 2.
    //{
    //    Dispose(false);
    //}
    #endregion

直到你的代码有了第二部分的代码,才需要终结器(或析构函数)语法的。否则,为了安全起见,应该实现它。也就是说,即使程序员没有正确调用dispose方法,finalize也应该清理非托管资源。

比较示例:来自msdn

http://msdn.microsoft.com/en-us/library/system.idisposable.dispose.aspxhttp://msdn.microsoft.com/en-us/library/fs2xkftw.aspx

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/386762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档