繁体   English   中英

MS Access MDB 文件不断损坏

[英]MS Access MDB-File keeps becoming corrupted

我们遇到了 Microsoft Access .mdb 文件的问题。 在多用户环境中使用 .mdb 文件一段时间后,该文件已损坏,必须修复。 修复后,再次损坏所需的时间更少。 并且在多次重复后的某个时刻,该文件根本不再可用。

在我们从 MS Access Runtime 2010 更改为 MS Access Runtime 2013 后,此问题开始出现。

我已经花了一些时间研究这个问题,这是我的理论:

mdb 文件似乎包含一个“数据库标题页”(在 1996 年 Microsoft 的名为“了解 Microsoft Jet 锁定”的白皮书中有所描述),它保存有关用户提交字节的信息(重要:0000 = 写入磁盘,0100 =访问了损坏的页面)。 白皮书中有一段关于此数据库标题页的段落,它准确解释了我们问题中发生的情况:

“[...]因此,如果 00 00 的值存在而没有相应的用户锁定 [我认为这将是相应的 .ldb 文件中的一个条目],或者存在 0100 的值,用户将不被允许在不首先执行修复实用程序的情况下连接到数据库。”

所以我的猜测是,在失去与 mdb 的连接/断开连接后,此数据库标题页溢出,您必须修复文件,但修复不会删除此数据库标题页中的每个条目,因此数量文件损坏所需的断开连接数减少,直到文件完全断开。

现在我想知道这个理论是否有任何好处,如果是,我想知道:

  1. 我如何测试这个理论(我如何阅读 mdb 文件的这个数据库标题页)?

  2. 我可以修改数据库标题页吗?

  3. 有人在使用 mdb 时,我可以修改数据库标题页吗?

我知道这是一个非常具体的问题,但我希望你们能帮助我!

PS 我找不到白皮书的链接,但“LDBViewer”包包含此白皮书。

我经常使用的一些快速而肮脏的技巧是通过创建一个小型数据库来启用的,该数据库服务于一个目的:控制如何打开所需的目标数据库。 这个数据库被复制到每个用户的桌面,所以每个用户/会话都有自己的。

所以我会
* 服务器位置上的 1 个数据库: [TheBigOne.mdb]
* 1 个数据库复制到多个桌面: [TheCaller.mdb]

--01-- :每天早上,调用一个函数来执行以下步骤:


* rename [TheCaller.mdb] to [TheCaller-xxx.mdb]
* create and open [TheCaller-NEW.mdb]
* for all tables, queries, forms, reports, macros, modules
   DoCmd.TransferDatabase acImport, , [TheCaller-xxx.mdb], _
   acTable-acQuery-acForm-acReport-acMacro-acModule, "y", "y", False
* rename [TheCaller-NEW.mdb] to [TheCaller.mdb]

--02-- 使用一个按钮在[TheCaller.mdb]创建一个表单,带有一个OnClick事件,例如:
 If Dir(ServerLocation & "\\TheBigOnd.ldb") = "" Then 'open [TheBigOne.mdb] Then Msgbox "Database already in use!" End If
这很容易让人头疼,因为会发生[TheBigOnd.ldb]文件确实存在,而没有人使用数据库的情况。 但至少,您将减少数据库损坏。

--03-- 此过程的替代方案 --02-- 可以通过使用命令行开关/excl来实现。 在任何给定时间,只有一个用户能够在数据库中工作。

--04-- 从点 --02-- 在表单上创建第二个按钮,它将使用命令行开关/ro打开[TheBigOne.mdb] 这将为该用户以只读模式打开数据库,避免数据库损坏。

--05-- 在服务器位置创建一个小型后端数据库db_sessions.mdb ,其中有一个表,如T_Sessions(id, whois, started_at_timestamp, ended_at_timestamp, excl_or_ro, troubles)用于跟踪 [who] [opens] 和 [关闭] [何时] 数据库[TheBigOne.mdb]
如果用户想要比只读更多的权限,则以下测试必须为真: DCount("*","T_Sessions","ended_at_timestamp is null AND excl_or_ro = 'excl'") = 0 如果此测试结果为false ,则该字段troubles可用于向其他用户发送消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM