安全な廃棄等必要なのDbConnection
-
23-08-2019 - |
質問
いクラスと呼ばれDatabaseHelperのロッドやルアーを使用することは、DbConnection.どの適切な設定をこのクラスを使用。私の実施IDisposibleなくなった時、私は呼び出します。Close()または接続します。Dispose().
私は単に電話接続します。Dispose()自分のDispose()メソッドは、この思いがあり、SocketExceptionからDbConnectionオブジェクトです。っているものと推察されるが、古いの接続に開かれているという立場をともありません詳細は添付の例外だったので、知らない。
解決
あなたのDisposeメソッド内からconnection.Dispose()を呼び出します。あなたは、上記と単純にIDisposableをインターフェイスを実装超えて、管理されていないなどのオブジェクトを配置することができますIDisposableをし、実装するための標準的なパターンになります。
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 /ライブラリ/ system.idisposable.aspx に)。
他のヒント
こののニュースグループによると:
ここIDbConnection.Dispose()が(反射ユーティリティが示すように)実装されている方法である。
のSqlClientます:
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メソッドのみが開いている場合は、接続を閉じようとする必要があります。
このデストラクタの構文はactualyのfinalizer.のfinalizerは呼び出し処理(false) 方法。
#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
はありま 必要なし のfinalizer(またはデストラクタの構文 でコード2コード.そうでない場合は実施すべきは、安全側となります。ieっても、プログラマが呼び出しを処理方法を適切に決まると、ウェイトレスのポリシー資源です。
比較例:らにmsdn
http://msdn.microsoft.com/en-us/library/system.idisposable.dispose.aspx & http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx
ちょうどそれは、廃棄()メソッド(偽渡し)を呼び出して、あなたのクラスのファイナライザ(デストラクタ)を含むように、条約の、IDisposableを実装パターンを完了します。これは、クラスの消費者が廃棄する()呼び出しに失敗した場合は、管理対象外のオブジェクトを処分することができ、フェイルセーフメカニズムとして機能します。
~MyClass()
{
Dispose(false);
}