使用 WebDAV 与 Apache Web 服务器共享的 Microsoft Access 后端 .accdb 文件无法链接为外部数据

Microsoft Access backend .accdb file shared with Apache Web Server using WebDAV could not be linked as an external data

我想我已经朝这个方向前进了很多,但这似乎是我 运行 不知道如何解决的最后一个问题。

我的意图是将我的 Microsoft Access (.accdb) 数据库拆分为后端(纯表)和前端(表单、查询、报告等),并通过 Internet 共享后端。

首先,我分裂成功了。 在 Microsoft Access 中,如果单击外部数据 -> Access,"File name" 字段将只接受 UNC 路径名。比如说,当我通过 LAN(家庭组)共享我的数据库时,客户端计算机上的 Windows 给我一个像 \\SERVERNAME\FolderName\MyDatabase_be.accdb 这样的 UNC,我可以(并确实)使用 link 我的后端文件到前端文件。我已经测试过了,对我来说效果很好。好的,没关系。

其次,我已经成功安装了 Apache Web 服务器,打开了它的 WebDAV,分配了一个目录来托管我的数据库表文件。我已经设置了 httpd.conf:

    Listen 192.168.0.101:80
    LoadModule actions_module modules/mod_actions.so
    LoadModule alias_module modules/mod_alias.so
    LoadModule allowmethods_module modules/mod_allowmethods.so
    LoadModule asis_module modules/mod_asis.so
    LoadModule auth_basic_module modules/mod_auth_basic.so
    LoadModule auth_digest_module modules/mod_auth_digest.so
    LoadModule dav_module modules/mod_dav.so
    LoadModule dav_fs_module modules/mod_dav_fs.so
    LoadModule dav_lock_module modules/mod_dav_lock.so

<Directory />
    AllowOverride All
    Require all denied
</Directory>

我还配置了 http-dav.conf:

Alias /sites "C:/database/database"

<Directory "C:/database/database">
    Dav On

    Require all granted

    AuthType Digest
    AuthName DAV-upload

    Options Indexes

    AuthUserFile "C:/Apache24le/user.passwd"
    AuthDigestProvider file

    # Allow universal read-access, but writes are restricted
    # to the admin user.
    <LimitExcept GET OPTIONS>
        require user admin
    </LimitExcept>
</Directory>

httpd-vhosts.conf:

DocumentRoot "C:/database"
    <Directory "C:/database">

    <VirtualHost _default_:80>
        DocumentRoot "C:/database"
    </VirtualHost>

我的 Apache Web 服务器在路由器后面,所以我还必须: 1. 在我的路由器上设置端口转发; 2. 让DHCP每次都给我的服务器MAC地址分配相同的IP;

使用标准 Windows 功能,我已将网络文件夹映射到我的系统,因此它可以完全访问。 它还为这个位置生成了一个 UNC(看下图)

UNC name provided by Windows

这应该是我的目标,所以我什至可以将我的 Microsoft Access 指向它。但是我打不开那个文件!!!当我尝试直接打开或从 Microsoft Access 引用数据库文件时,Microsoft Access 给我一条消息

"Your network access was interrupted. To continue, close the database, and then open it again"

An error message, which is the main concern of this post!!!

谁能帮我解决这个问题?

要完全了解正在发生的事情,您需要从低层次思考 Access 如何从 .accdb 文件读取和写入数据。当 Access 在本地或通过 UNC/SMB 在 LAN 上与该文件对话时,它能够使用块级 I/O 调用来打开、查找、读取、写入、关闭 .accdb 文件并获得对块中的信息。这是基于标准 Windows 的文件 I/O 正在运行。

现在您已经将该 .accdb 文件放到远程 WebDAV 服务器上,并且您正在使用 Microsoft WebDAV 重定向器与同一个 .accdb 文件通信。这一次,Windows 将使用 WebDAV 作为协议,而不是标准的旧 SMB 或直接文件 I/O。

Microsoft WebDAV 重定向器,因为它是基于 DAV 的,所以在原子文件级别而不是块级别运行。这意味着当 Microsoft Access 发出文件打开 + 文件读取调用时,低级别 MSDAV 重定向器将对远程文件执行完整的 GET 操作,并将整个 .accdb 文件复制到本地临时文件夹,然后再允许 MS Access 访问它。更进一步,如果 Access 执行一个 Seek(EOF-1byte),然后执行一个 read(1byte),WebDAV 重定向器将需要在 seek/read 完成之前下载整个 .accdb 文件。

市场上很少有基于 WebDAV 的重定向器技术允许通过 WebDAV 进行块级 I/O 分页类型请求。对于其中的大多数,它们只进行块读取,不能进行块 'writes',因为您还需要一个支持 PUT 上的 http 范围 header 的 DAV 服务器。这意味着如果 Access 尝试访问 .accdb 文件的最后一个字节,MS 重定向器将读取、访问整个文件,然后将整个文件写入和写入 apache WebDAV 服务器。

完全披露:我们的 WebDrive 产品支持 WebDAV 已经将近 15 年了,我们已经看到很多客户都在尝试完成同样的事情。他们想在 DAV 服务器上安装一个 Access 数据库,然后从一个 Windows 客户端共享和访问它,该客户端 运行 可以是 MS Access 或其他类型的自定义 Windows 应用程序访问。

虽然您最终可能能够使解决方案生效(前提是您找到了都支持 http 范围请求和块级 dav 锁定的 DAV 客户端和 DAV 服务器),但我不确定您是否会满意与整体性能。当两个不同的客户端试图同时访问同一个 .accdb 文件时,您也可能会遇到并发问题。 Microsoft 重定向器将为每个用户提供该 .accdb 文件的副本,如果他们都修改了该文件,您无法真正预测哪个文件将首先被推送到 Apache mod_dav,哪个将被另一个副本覆盖。

如果你真的想拆分你的数据存储和你的 forms/ui/presentation 层,你最好将你的 tables/views 移动到 sqlserver 或 sqlite 然后让你的 MS Access Forms/Queries/Reports 使用标准 TCP/IP 或 NP 访问传统 client-server 部署中的数据库。您可以在本地 运行 SqlExpress 并通过防火墙转发端口 1433,而不是使用 Apache/mod_dav.

抱歉,如果我对您的问题没有一个非常具体的答案;你的想法很合乎逻辑。只是我们已经看到很多其他人尝试实施此方法但未成功。我想确保我为您传递了这些信息。

希望您能找到适合自己的解决方案!