【问题标题】:how to disconnection access in my C# program?如何在我的 C# 程序中断开访问?
【发布时间】:2010-08-03 12:31:37
【问题描述】:

我尝试像这样压缩我的 Access 2007 数据库:

System.Diagnostics.Process.Start(@"C:\Program Files\Microsoft Office\Office12\msaccess.exe",@"c:\Mydb.mdb /compact "); 

在我的 C# 程序中,我得到了这个错误:

您试图打开已由计算机上的用户以独占方式打开的数据库。当数据库可用时再试一次。 (错误 3356)

我尝试了Conn.close(),但仍然收到错误

提前致谢。

【问题讨论】:

  • 你能高水平地说明你是如何阅读它的吗?
  • 听起来您在其他地方(在 Access 中)打开了数据库?当您的应用程序终止时,无论如何它都会为您关闭连接,但您的代码应始终关闭/释放任何连接。
  • 你可以在你的应用之外执行这些命令吗?
  • 你是自己运行应用还是在开发环境中运行?
  • 尝试从 Microsoft 下载 Process Explorer 并使用它来查看究竟是哪些进程使文件保持打开状态。

标签: c# winforms ms-access


【解决方案1】:

也许连接池是问题? 不完全确定在哪里实现连接池(我相信这只是提供者的一部分,例如 SQL 服务器,因此可能与此问题无关) 但即使连接对象设置为“关闭”,它也会保持客户端和服务器之间的连接打开。 您可以使用 conn.ClearPool 清除 sql server 连接池 您使用什么让提供商连接到您的数据库? (OLEDB?) 如果是这样,请尝试 ReleaseObjectPool()

【讨论】:

  • 我在 5 分钟前遇到了这个问题,虽然我没有显式调用 OleDbConnection.ReleaseObjectPool(),而是设置了连接字符串参数 OLE DB Services=-2,它显式禁用了连接池。
【解决方案2】:

检查您的任务管理器以查看您是否已打开 Access。如果这样做,请关闭这些实例并重试。

【讨论】:

  • 要寻找什么?在任务管理器中看不到访问权限
  • 您正在查看 MSAccess.EXE 是否已在运行。在使用带有 C# 的 Microsoft Office 应用程序时,我总是发现如果不让可执行文件仍在任务管理器中运行,我就无法正常退出应用程序。
  • 打开文件的不一定是 MSACCESS.EXE。任何使用 Jet 的程序都可以打开它。
【解决方案3】:

也许出了点问题,你只是有一个额外的 *.ldb 文件。转到存储数据库的位置:

c:\Mydb.ldb

如果没有人使用它,请删除该文件。

【讨论】:

    【解决方案4】:

    在 Access 中压缩和修复的工作方式是压缩到一个新文件,删除原始文件,然后重命名。你可以使用 DAO 引擎来做同样的事情。据我从 MS Visual C# 2010 Express 中得知,您可以设置对 DAO 的引用并使用它:

    var MyDBE=new DAO.DBEngine();
    MyDBE.CompactDatabase("c:\\docs\\Mybe.mdb", "c:\\docs\\temp.mdb");
    

    为确保数据库没有被使用,您可以检查.ldb是否存在。

    对不起,我对c#一窍不通,所以这些笔记很粗糙。

    【讨论】:

    • LDB文件的存在并不代表文件是打开的,因为LDB文件可以在最后一个用户关闭后留下。发生这种情况的情况有很多,包括但不限于用户是否缺乏对文件夹的 DELETE 权限。如果 LDB 不存在,则意味着没有人将其打开,但如果它存在,则仅表明有人可能将其打开,而不是证明它。一种检查方法是尝试删除 LDB 文件(如果存在),但随后您将捕获结果错误,因此您不妨捕获压缩失败错误。
    【解决方案5】:

    //编辑开始

    查看这些基本的故障排除项目:

    http://office.microsoft.com/en-us/access-help/troubleshoot-compacting-repairing-or-recovering-an-access-file-HP005188316.aspx?queryid=728e1007c19b43bba069cb7f11364f7a&respos=0&CTT=1

    看看有没有以上原因导致compact失败!

    //编辑结束

    检查以下链接: http://support.microsoft.com/kb/209207

    在代码中使用 /excl 以独占方式打开它。

    所以代码是:

    System.Diagnostics.Process.Start(@"C:\Program Files\Microsoft Office\Office12\msaccess.exe",@"c:\Mydb.mdb /excl /compact "); 
    

    通过使用 excl 选项,您将以独占方式打开它!

    希望对你有帮助!

    【讨论】:

    • 查看故障排除链接,看看是否有任何问题导致问题:office.microsoft.com/en-us/access-help/… 即使该链接用于修复,我认为您的权限问题可以通过它解决,因为压缩和修复需要独占访问权限。希望对您有所帮助!
    • 自 Jet 3.51 以来没有单独的“修复”过程,c。 1997. 如果发现文件的内部结构损坏,则作为压缩过程的一部分进行修复。所以,真的只有 COMPACT 需要担心。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 2016-09-06
    • 2011-01-27
    • 2011-11-11
    相关资源
    最近更新 更多