我在连接到位于远程计算机上的Access数据库时遇到了一些问题:
Microsoft Access数据库引擎无法打开或写入文件' \\ ACCESSSERVER-PC \ Warehouse Manager \ Error Logging \ Error Logging.accdb'。它已由另一个用户专门打开,或者您需要获得查看和写入其数据的权限。
数据库未开放供其他人编辑,我应该可以连接到它。
我正在使用此连接字符串:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\ACCESSSERVER-PC\Warehouse Manager\Error Logging\Error Logging.accdb;Persist Security Info=False;
调用connOpen();
using (var conn = new OleDbConnection(ConnectionString))
{
try
{
conn.Open();
}
}
我为自己提供了服务器以及.accdb
文件自身的完全权限,并根据this post为NETWORK SERVICE
帐户执行了相同的权限,但仍然没有运气。
我在连接到本地存储的数据库时没有问题,而这似乎只会发生在通过网络进行连接的过程中。
有没有其他人经历过这个并找到了解决方案?非常感谢任何帮助或建议。
我已检查this answer并确认我拥有访问该文件所需的所有权限。
该问题被标记为this question的副本,但我没有运行任何会对该文件打开流的程序。
答案 0 :(得分:1)
事实证明,这是因为尝试使用一些糟糕的IT基础架构造成的。
问题是\\ACCESSSERVER-PC
实际上是Windows 7计算机,因此只能处理有限数量的连接。
从this answer对数据库文件运行IsLocked
代码给了我一个更有用的错误消息:
此时无法再与此远程计算机建立连接,因为计算机可以接受的连接数已经很多。
让一些用户断开其Access运行时并从服务器映射驱动器并再次运行代码后,IsLocked
返回false
,然后我就可以连接到数据库了。
以下是我用来帮助我找到解决方案的代码:
protected virtual bool IsFileLocked(FileInfo file)
{
FileStream stream = null;
try
{
stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.None);
}
catch (IOException)
{
//the file is unavailable because it is:
//still being written to
//or being processed by another thread
//or does not exist (has already been processed)
//
// ** OR There are already too many connections open to the
// ** "server" where the file exists!
return true;
}
finally
{
if (stream != null)
stream.Close();
}
//file is not locked
return false;
}
当您需要与服务器建立20多个并发连接时,故事的道德是不使用(或在他们使用的环境中工作)Windows 7计算机作为服务器!