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

5

myConnection.Close();尝试调用后myConnection.Dispose();

事实上,我相信.Dispose()也关闭了连接,所以简单的替换.Close()应该.Dispose()可以解决问题。

于 2013-08-07T20:53:53.600 回答
3

我有同样的问题,这是解决方案:

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

现在它可以工作了。

于 2015-09-01T11:45:02.767 回答
2

实际上,这就是问题所在。我在处理后添加了 GC.Collect() ,现在它可以工作了。– 垃圾强盗 2013 年 8 月 7 日 21:14

我有同样的问题,这就是解决方案。

于 2014-03-17T18:11:53.980 回答