我认为我已朝这个方向发展很多,但这似乎是我用尽线索的最后一个问题如何解决。
我的目的是将我的Microsoft Access(.accdb)数据库拆分为后端(纯表)和前端(表单,查询,报告等),并通过Internet共享后端。
首先,我成功分裂了。 在Microsoft Access中,如果单击外部数据 - > Access,“文件名”字段只接受UNC路径名。比方说,当我通过LAN(家庭组)共享我的数据库时,客户端计算机上的Windows为我提供了一个UNC,如 \\ SERVERNAME \ FolderName \ MyDatabase_be.accdb ,我可以(并且确实)使用它来链接我的后端文件到前端文件。我测试了它,它对我来说很好。好的,没关系。
其次,我成功安装了Apache Web Server,切换了'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 Server是在路由器后面,所以我还必须: 1.在我的路由器上设置端口转发; 2.使DHCP每次都为我的服务器的MAC地址分配相同的IP;
使用标准Windows功能,我已将网络文件夹映射到我的系统,因此它可以完全访问。 它还为此位置制作了UNC (请看下图)
这应该是我的目标,所以我甚至可以指向我的Microsoft Access。但是我无法打开那个文件!当我尝试直接打开或从Microsoft Access引用数据库文件时,Microsoft Access给我一条消息
“您的网络访问被中断。要继续,请关闭数据库, 然后再打开它“
An error message, which is the main concern of this post!!!
任何人都可以帮我吗?
答案 0 :(得分:0)
要完全了解正在发生的事情,您需要在较低级别考虑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)后读取(1byte),WebDAV重定向器将需要在搜索/读取完成之前下载整个.accdb文件。
市场上很少有基于WebDAV的重定向器技术允许通过WebDAV进行块级I / O分页类型请求。对于大多数人来说,他们只会进行块读取,他们不能阻止写入&#39;因为您还需要一个支持PUT上的http范围标头的DAV服务器。这意味着如果Access尝试触摸.accdb文件的最后一个字节,MS重定向器将读取,触摸,然后将整个文件写入apache WebDAV服务器。
完全披露:我们已经在我们的WebDrive产品中获得了近15年的WebDAV支持,而且我们已经看到很多客户正在努力完成同样的事情。他们希望在DAV服务器上安装Access DB,然后从运行MS Access或与Access通信的其他类型的自定义Windows应用程序的Windows客户端共享和访问它。
虽然您可能最终能够使解决方案正常工作(假设您找到了支持http范围请求和阻止级别dav锁定的DAV客户端和DAV服务器),我不太确定您会高兴整体表现。当两个不同的客户端同时尝试访问同一个.accdb文件时,您可能也会遇到并发问题。 Microsoft重定向器将为每个用户提供该.accdb文件的副本,并且如果它们都修改了该文件,您无法预测哪个文件将首先被推送到Apache mod_dav,哪些文件将被覆盖与另一份副本。
如果您真的想要拆分数据存储和表单/ ui /表示层,最好将表/视图移动到sqlserver或sqlite,然后让MS Access Forms / Queries / Reports使用标准TCP / IP或NP在传统的客户端 - 服务器部署中访问数据库。您可以在本地运行SqlExpress,并通过防火墙转发端口1433,而不是使用Apache / mod_dav。
很抱歉,如果我对您的问题没有特别的回答;你的想法很合乎逻辑。只是我们已经看到很多其他人尝试实现这一点并不成功,我想确保为您传递信息。
我希望你能得到一个适合你的解决方案!