4

OleDb で接続している Access データベースがあります。接続と使用に関してはすべて正常に機能していますが、ファイルのバックアップを作成する必要があります。

私は接続を閉じています:

  public class myDbHandlerClass
  {

    private OleDbConnection myConnection;
    //in reality this string gets built by properties to the class
    //it ends up being this...
    //Yes Jet 4.0 this is an Access 2003 database
    private string myConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=myDatabase.mdb";

    public void OpenDatabase()
    {
      //to open the database
      try
      {
        // Does a previous connection exist?
        if ((myConnection != null) && myConnection.State != ConnectionState.Closed) return;

        //No database connection string is specified, can't continue
        if (string.IsNullOrEmpty(myConnectionString)) return;

        myConnection = new OleDbConnection(myConnectionString);
        myConnection.Open();

      }
      catch (Exception ex)
      {
        ExTrace.WriteLineIf(TraceLog.TraceError, ExTrace.ShowException(ex));
      }
    }

    public void CloseDatabase()
    {
      try
      {
        if ((myConnection == null)) return;

        if (myConnection.State != ConnectionState.Closed) myConnection.Dispose();
        myConnection = null;
        GC.Collect();
      }
      catch (Exception ex)
      {
        ExTrace.WriteLineIf(TraceLog.TraceError, ExTrace.ShowException(ex));
      }
    }
  }

例外はスローされず、接続状態 == クローズ、myConnection == null ですが、.ldb ファイルは消えません。「myDatabase.mdb」ファイルを「myDatabase.bak」に移動するはずの後続のコードは、プログラムによってファイルが既に使用されているため失敗します。

実際に閉じていてロックされていないことを確認するにはどうすればよいですか。

編集:以下のコメントからの提案でコードを変更しましたが、現在は機能しています。

myConnection.Dispose(); 

そして明示的に GC.Collect() を呼び出す

それが機能したのです。

助けてくれてありがとう!

4

3 に答える 3

3

私は同じ問題を抱えていましたが、これが解決策でした:

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

そして今それは動作します。

于 2015-09-01T11:45:02.767 に答える