如何连接到远程数据库

时间:2017-01-24 11:28:09

标签: c# database ms-access permissions remote-server

我在连接到位于远程计算机上的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 postNETWORK SERVICE帐户执行了相同的权限,但仍然没有运气。

我在连接到本地存储的数据库时没有问题,而这似乎只会发生在通过网络进行连接的过程中。

有没有其他人经历过这个并找到了解决方案?非常感谢任何帮助或建议。

我已检查this answer并确认我拥有访问该文件所需的所有权限。

该问题被标记为this question的副本,但我没有运行任何会对该文件打开流的程序。

1 个答案:

答案 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计算机作为服务器!