Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在我的C#程序中断开访问?_C#_Winforms_Ms Access - Fatal编程技术网

如何在我的C#程序中断开访问?

如何在我的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(),但仍然出现了错误 提前感谢。检查您的任务管理器,

我试图压缩Access 2007数据库,如下所示:

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
,该参数显式禁用连接池。