【问题标题】:Closing connection to Access DB with OleDb使用 OleDb 关闭与 Access DB 的连接
【发布时间】:2013-08-09 09:52:22
【问题描述】:

我有一个使用 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”失败,因为该文件已被我的程序使用。

如何确保它实际上已关闭而不是锁定。

编辑: 我根据下面 cmets 的建议修改了代码,现在它可以工作了。

myConnection.Dispose(); 

并显式调用 GC.Collect()

是什么让它工作。

感谢您的帮助!

【问题讨论】:

  • 你是在声明 myConnection 吗??
  • 可能是它已关闭但未释放,它只是回到连接池中。
  • 我已经编辑了代码以包含数据库的声明和打开。 myConnection 在类中被声明为私有变量。我已经确定只有一个类的实例,所以应该只有一个打开的连接。

标签: c# ms-access oledb


【解决方案1】:

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

事实上,我相信.Dispose() 也在关闭连接,所以简单地将.Close() 替换为.Dispose() 就可以了。

【讨论】:

  • 其实这就是问题所在。我在 dispose 之后添加了 GC.Collect(),现在它可以工作了。
  • @trashrobber,您应该将此设置为您的答案,然后在可能的情况下接受它。
【解决方案2】:

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

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

现在它可以工作了。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      相关资源
      最近更新 更多