VB6 应用程序在创建后一直锁定 Access (.mdb) 数据库,导致错误 3028

Posted

技术标签:

【中文标题】VB6 应用程序在创建后一直锁定 Access (.mdb) 数据库,导致错误 3028【英文标题】:VB6 application keeps lock on Access (.mdb) database after creation, causing an error 3028 【发布时间】:2012-11-10 16:52:42 【问题描述】:

我们的应用程序构建一个 Access 数据库 (.mdb),然后使用 Shell 命令启动另一个应用程序,该命令需要对该数据库的读/写访问权限。问题是在某些系统上,我们的应用程序似乎不规律地在数据库上保留了排他锁,从而阻止了其他应用程序访问它。只有关闭第一个应用程序后,另一个应用程序才能继续。

引发的特定错误是错误 3028,这似乎是我们确实使用的 DAO 3.51 (Access '97) 所特有的。我不明白为什么有些系统会受到影响(然后又不一致),而有些则不会。我认为这可能是一个时间问题,并且在构建数据库和启动另一个应用程序之间建立了 Sleep 期间,但这没有帮助。

发生了什么事?

编辑: 我现在通过在单独的文件中创建数据库然后复制它来创建解决方法。现在第二个程序应该总是能够访问它,并且任何剩余的锁定问题都会出现在我维护的第一个程序中。当我们的用户能够对此进行测试时,我会跟进。

【问题讨论】:

【参考方案1】:

您是否在将控制权交给另一个 EXE 之前关闭与 DB 的连接?

【讨论】:

不,我不是。这不只是扭转了问题吗?另一个应用程序锁定它并且第一个程序无法访问它?他们都需要读/写访问权限。一旦最初的问题得到解决,读写操作(可能是并发的)就不会导致任何问题。永远。 这取决于您的应用程序如何打开它。从第一个应用程序打开与数据库的连接时,尝试添加“adModeShareDenyNone”标志。另一个问题可能是您的第二个程序正在以有限的用户权限打开...尝试使用 ShellExecute(Me.hwnd, "runas", App.Path & "Project.exe", "", App.Path, vbNormalFocus) 行打开它(不要忘记在模块中声明 ShellExecute)。 @George 我怀疑您的建议是否有用。它们涵盖了错误可重复而不是无规律地发生的情况。此外,使用“runas”,在管理员模式下有效地运行第二个程序,看起来很丑陋,在 WinXP 中给出了奇怪的结果。 @Dabblernl “不规律地”仅仅意味着我们还没有弄清楚模式。其中一种调试方法是消除方法——消除场景,无论它们多么“丑陋”或“不太可能”。看到这个问题尚未解决,很有可能该问题是那些丑陋且不太可能发生的情况之一。如果您决定尝试,请告诉我建议的结果。【参考方案2】:

我之前遇到过类似的问题,但不太一样,但根据您的描述,这是我会尝试的方法:

在使用 shell 命令启动辅助应用程序之前。

除了您已经使用的睡眠时间,您还需要关闭生成 .mdb 文件的原始程序。

我通过对 Windows 批处理文件进行脱壳,然后立即退出原始程序来实现这一点。

批处理文件构成如下:

ping -n 5 localhost >NUL
start MSAccess.exe "C:\DB.mdb"
exit

这允许在启动之前释放 mdb 文件 5 秒,您可以将我的 Ms Access 调用替换为您的辅助程序。

【讨论】:

以上是关于VB6 应用程序在创建后一直锁定 Access (.mdb) 数据库,导致错误 3028的主要内容,如果未能解决你的问题,请参考以下文章

从 VB6 向 MS Access 插入订单

如何在宏禁用系统上锁定 Access 数据库?

旧版 VB6 应用程序访问 SQL 数据库迁移

如何在 VB6 窗体中使用 Microsoft Office Access 的子窗体控件?

在VB6中,设置FARPOINT SPREAD控件的哪个属性,以锁定显示的内容,不能修改显示的数据

VB6/Microsoft Access/DAO 到 VB.NET/SQL Server... 有建议吗?