如何在我的C#程序中断开访问?
我试图压缩Access 2007数据库,如下所示:如何在我的C#程序中断开访问?,c#,winforms,ms-access,C#,Winforms,Ms Access,我试图压缩Access 2007数据库,如下所示: System.Diagnostics.Process.Start(@"C:\Program Files\Microsoft Office\Office12\msaccess.exe",@"c:\Mydb.mdb /compact "); 在我的C#程序中,我得到以下错误: 您试图打开已由计算机上的用户以独占方式打开的数据库。数据库可用时重试。(错误3356) 我尝试了Conn.close(),但仍然出现了错误 提前感谢。检查您的任务管理器,
System.Diagnostics.Process.Start(@"C:\Program Files\Microsoft Office\Office12\msaccess.exe",@"c:\Mydb.mdb /compact ");
在我的C#程序中,我得到以下错误:
您试图打开已由计算机上的用户以独占方式打开的数据库。数据库可用时重试。(错误3356)
我尝试了Conn.close()
,但仍然出现了错误
提前感谢。检查您的任务管理器,查看您是否已打开访问权限。如果您这样做了,请关闭这些实例并重试。可能出了问题,您只是有一个额外的*.ldb文件。转到存储数据库的位置: c:\Mydb.ldb 如果没有人使用它,请删除该文件 //编辑开始 查看以下基本故障排除项目: 查看上述原因是否导致紧凑型电脑出现故障 //编辑结束 检查以下链接: 与代码一起使用/excl以独占方式打开它 所以代码应该是:
System.Diagnostics.Process.Start(@"C:\Program Files\Microsoft Office\Office12\msaccess.exe",@"c:\Mydb.mdb /excl /compact ");
通过使用excl选项,您将以独占方式打开它
希望有帮助 压缩和修复在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#一无所知,所以这些注释非常粗糙。可能是连接池的问题? 不完全确定在何处实现连接池(我认为这只是提供程序的一部分,例如SQL server,因此可能与此问题无关) 但即使连接对象设置为“关闭”,它也会保持客户端和服务器之间的连接打开。 您可以使用conn.ClearPool清除sql server连接池 提供程序使用什么连接到您的数据库?(OLEDB?)
如果是这样,请尝试ReleaseObjectPool()您能提供一个关于如何从中读取的高级别信息吗?听起来您好像在其他地方(Access中)打开了数据库?当您的应用程序终止时,它将为您关闭连接,但是,您的代码应该始终关闭/处理所有连接。您可以在应用程序外部执行这些命令吗?您是单独运行应用程序还是在开发环境中运行应用程序?请尝试从Microsoft下载Process Explorer,并使用它查看保持文件打开的确切进程。要查找什么?a任务管理中的不可见访问您正在查看MSAccess.EXE是否已在运行。在使用带有C#的Microsoft Office应用程序时,我总是发现,如果不让可执行文件仍在任务管理器中运行,我就无法优雅地退出应用程序。打开文件的不一定是MSACCESS.EXE。任何使用Jet的程序都可以将其打开。请查看故障排除链接,看看是否有任何链接导致了问题:即使该链接用于修复,我认为您的许可问题也可以通过它解决,因为压缩和修复都需要独占访问。希望有帮助!自从Jet 3.51,c。1997如果发现文件的内部结构已损坏,则作为压缩过程的一部分进行修复。因此,真正需要担心的是压缩。LDB文件的存在并不意味着该文件是打开的,因为LDB文件可以在最后一个用户关闭后保留。出现这种情况的场景有很多,包括但不限于用户缺乏对文件夹的删除权限。如果土发局不在那里,就意味着没有人打开它,但如果它在那里,它只表明有人可能打开它,而不是证明它。检查的一种方法是尝试删除LDB文件(如果它在那里),但随后会捕获结果错误,因此您也可以捕获compact fail错误。我在5分钟前就遇到了这个问题,但没有显式调用
OleDbConnection.ReleaseObjectPool()
,而是,我设置了连接字符串参数oledb Services=-2
,该参数显式禁用连接池。