2

C# プロジェクトで OleDbDataReader クラスを使用していますが、実行後にプログラムが mdb ファイルをロックし続けます。最後に接続を確実に閉じてロックを解除するにはどうすればよいか疑問に思っています。また、クエリを実行するたびに閉じる必要がある場合、またはプログラムの最後にすべてを一度に行うことができます。これが私がそれを設定する方法です:

private OleDbConnection myDbC = new OleDbConnection(connectionString);
myDbC.Open();

そして、これが私が何度も何度も使用する方法です:

OleDbCommand cmd = new OleDbCommand(SQL, myDbC);
OleDbDataReader reader = cmd.ExecuteReader();
reader.Close();

プログラムが終了したら、次のことも行います。

myDbC .Close();

したがって、これはどういうわけかmdbファイルをロックしています。何か助けはありますか?

4

2 に答える 2

1

キーワードを使用して使用することをお勧めします。接続とリーダーを閉じたり破棄したりするのを忘れることがあるためです。を使用すると、オブジェクトが自動的に破棄されるためです。Using ステートメントは、using ブロックで指定されたオブジェクトが不要になったら解放するように .NET に指示します。

using (OleDbConnection conn = /* Create new instance using your favorite method */)
{
    conn.Open();
    using (OleDbCommand command = /* Create new instance using your favorite method */)
    {
        using (OleDbDataReader dr = cmd.ExecuteReader())
        { 
            while (dr.Read()) 
            { 
                //read here 
            } 
       } 
    }
    conn.Close(); // Optional
}

MSDNからの追加の詳細:

C# は、.NET Framework 共通言語ランタイム (CLR) を通じて、不要になったオブジェクトの格納に使用されているメモリを自動的に解放します。メモリの解放は非決定論的です。CLR がガベージ コレクションの実行を決定するたびに、メモリが解放されます。ただし、通常は、ファイル ハンドルやネットワーク接続などの限られたリソースをできるだけ早く解放することをお勧めします。

using ステートメントを使用すると、プログラマは、リソースを使用するオブジェクトがそれらを解放するタイミングを指定できます。using ステートメントに提供されるオブジェクトは、IDisposable インターフェイスを実装する必要があります。このインターフェイスは、オブジェクトのリソースを解放する Dispose メソッドを提供します。

于 2013-05-31T17:41:19.123 に答える
1

接続することは常に良い習慣.Close()です。ガベージ コレクターに頼ってはいけません。接続が自動的に閉じられる特定の状況があります。SqlDataAdapteraとその.Fill()メソッドを使用するときのように。しかし、コードで接続を管理する必要があるという事実は変わりません。

そうは言っても、これは次のようなusing ステートメントで最もよく達成されます。

using(OleDbConnection oledbConn = new OleDbConnection())
{
   oledbConn.Open();       
}

これらの using ステートメントをネストしたり、コマンド オブジェクトやデータ アダプターをラップしたりすることもできます。

using(OleDbConnection oleDbConn = new OleDbConnection())
{
   oleDbConn.Open(); 
   using (OleDbCommand oleDbCmd = new OleDbCommand())
   {
      using (OleDbDataAdapter oleDbAdapter = new OleDbDataAdapter())
      {
         //More code can go here.
      }
   }
   oleDbConn.Close();      
}
于 2013-05-31T17:52:36.060 に答える