关闭使用OleDb连接Access数据库的连接

4

我有一个Access数据库,正在使用OleDb进行连接。 连接和使用都很顺利,但我需要备份文件。

我正在关闭连接:

  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()是让它正常工作的关键。

感谢您的帮助!


1
你在哪里声明了myConnection变量? - Botonomous
3
很可能它已经关闭但并未被丢弃,只是重新回到了连接池中。 - Tim
我已经编辑了代码,包括数据库的声明和打开。myConnection在类中声明为私有变量。我确保只有一个类实例,因此应该只有一个打开的连接。 - trashrobber
3个回答

5

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

实际上,我认为.Dispose()也会关闭连接,所以简单地将.Close()替换为.Dispose()即可解决问题。


1
实际上,这就是问题所在。我在Dispose之后添加了GC.Collect(),现在它可以工作了。 - trashrobber
1
@trashrobber,你应该将这个设为你的答案,然后在可以的时候接受它。 - logixologist

3

我曾经遇到了同样的问题,这是解决方案:

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

现在它能正常工作了。


2

实际上,这就是问题所在。我在dispose后添加了GC.Collect(),现在它可以正常工作了。 - trashrobber 2013年8月7日21:14

我也遇到了同样的问题,这就是解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接