2010-08-03 45 views
4

我试图压缩我的Access 2007数据库是这样的:如何在我的C#程序中断开连接?

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

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

You attempted to open a database that is already opened exclusively by user on machine . Try again when the database is available. (Error 3356)

我试图Conn.close(),但仍然得到错误

谢谢提前。

+0

你可以给你一个关于你如何阅读的高层次? – Nix 2010-08-03 12:35:40

+0

听起来像你有其他地方打开数据库(在Access中)?当你的应用程序终止时,它已经关闭了你的连接,但是你的代码应该总是关闭/处理任何连接。 – 2010-08-03 12:37:48

+1

你可以在你的应用程序之外执行这些命令吗? – Andrey 2010-08-03 12:38:21

回答

0

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

+0

要寻找什么?没有看到访问任务管理器 – Gold 2010-08-03 13:02:18

+1

您正在查看是否MSAccess.EXE已在运行。在C#中使用Microsoft Office应用程序时,我总是发现,我无法正常退出应用程序,也不会在任务管理器中保留可执行文件。 – 2010-08-03 13:57:52

+0

这不一定是打开文件的MSACCESS.EXE。任何利用Jet的程序都可以打开它。 – 2010-08-04 18:30:09

0

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

c:\Mydb.ldb

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

+0

感谢您的帮助,但无益 - 同样的错误 – Gold 2010-08-03 13:01:15

0

//编辑开始

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

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

看看是否有上述原因导致紧凑的失败!

//编辑结束

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

使用/与代码以独占方式打开它不包括。

因此,代码如下:

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

通过使用你将完全打开它不含选择!

希望它有帮助!

+0

感谢您的帮助,但无益 - 同样的错误 – Gold 2010-08-03 13:00:33

+0

查看故障排除链接,看看他们是否有任何问题导致: http://office.microsoft.com/en- us/access-help/troubleshoot-compacting-repair-or-recovering-an-access-file -HP005188316.aspx?queryid = 728e1007c19b43bba069cb7f11364f7a&respos = 0&CTT = 1 即使链接是用于修复,我认为您的权限问题可能会由于压实和修复需要独占访问权限,因此需要解决它。 希望它有帮助! – Vaibhav 2010-08-03 14:53:24

+0

自Jet 3.51以来,没有一个单独的“修复”过程,c。如果发现文件的内部结构已损坏,修复将作为紧凑进程的一部分发生。所以,真的只有COMPACT才会担心。 – 2010-08-03 20:08:31

0

紧凑的方式&在Access中修复工作是它压缩到一个新的文件,删除原来的文件,然后重命名。你可以使用DAO引擎来做同样的事情。至于我可以从微软的Visual C#2010速成告诉,你可以设置为DAO的引用和使用:

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

为了保证数据库不在使用中,您可以检查是否存在的.ldb。

对不起,我对c#一无所知,所以这些注释非常粗糙。

+0

LDB文件的存在并不意味着该文件处于打开状态,因为LDB文件可以在最后一个用户关闭后留下。发生这种情况的场景很多,包括但不限于如果用户缺少文件夹的DELETE权限。如果LDB不在那里,就意味着没有人打开它,但如果它在那里,它只表明有人可能会打开它,而不是证明它。检查的一种方法是尝试删除LDB文件(如果存在的话),但是那样会导致产生的错误,因此您可能只需要捕获紧凑的失败错误。 – 2010-08-03 20:10:40

2

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

+0

5分钟前我有这个问题,虽然我没有明确调用'OleDbConnection.ReleaseObjectPool()',而是设置了连接字符串参数'OLE DB Services = -2',它显式地禁用了连接池。 – Rabid 2010-08-04 09:41:40