如何跟踪 Access 崩溃

Posted

技术标签:

【中文标题】如何跟踪 Access 崩溃【英文标题】:How can I track Access crashes 【发布时间】:2015-07-27 19:35:00 【问题描述】:

我被要求在几个数据库表单上添加一个新按钮。该按钮更改记录所在的队列,然后关闭表单。没有什么花哨。我在三种不同的表单上有相同的按钮和相同的代码。在其中 2 个表单上,它的工作原理与我预期的一样。

该按钮在最后一个表单上每隔一次都可以正常工作,并且在其他尝试时使 Access 崩溃。我尝试添加错误日志记录,但它在记录任何内容之前崩溃。我已经单步执行了代码,它在下面的代码中的 rs.Edit 处崩溃...

按钮点击事件后面的表单代码:(每个表单的按钮后面都有这个)

Private Sub bRtD_Click()

  LogReturnToDashboard Me.Recordset

  DoCmd.Close acForm, Me.Name, acSaveNo

End Sub

调用函数:(删除错误处理程序,因为它无论如何都不会被触发,并保持已经很长的帖子更短)

Public Function LogReturnToDashboard(ByRef rs As DAO.Recordset)
Dim sSQL As String
Dim lLoc As Long

'Get Dashboard
  lLoc = GetDashboard(rs!Role)

  sSQL = "INSERT INTO tblActivity ( Vendor, FromLocation, OldStatus, ToLocation ) " & _
         "VALUES (" & rs!VID & ", " & rs!Location & ", " & rs!Status & ", " & lLoc & ");"
  CurrentDb.Execute (sSQL)

  rs.Edit    <-------- This is where it crashes
  rs!Location = lLoc
  rs.Update

End Function

SQL 命令执行,我可以检查tblActivity 并看到记录被更改回仪表板的行。

Google-fu 似乎返回了 ADODB 记录集崩溃 Access 的问题,而不是 DAO。

为什么它每隔一段时间就会起作用?我不知所措。当它持续崩溃时,我显然无法发布它。

我检查了 AppLog 并找到了这个条目,但这并没有告诉我太多。这似乎是 Office 套件的一般错误,因为 Google 返回的页面声明问题是套件的每个部分。

有什么想法吗?只是更好地了解在哪里看会很棒,我已经搜索了错误日志的每个部分,似乎没有任何特定于 Access。

更新: 到目前为止,我有: - 创建了一个新数据库并导入了所有内容....重置引用...等 - 创建全新的表单并复制所有内容。 - 反编译数据库 - 逐步执行按钮背后的代码,这些代码似乎比其他按钮更频繁地崩溃......没有发现它们在类似的部分崩溃。 (除了这里的原始按钮之外,我现在还有其他导致 Access 崩溃的按钮......其他按钮都没有在 rs.edit btw 崩溃) - 下载了不同版本的 acedao.dll - 发布在 MS 网站上,希望得到更多答案...

到目前为止,我似乎仍然无法在防止这些崩溃方面取得任何进展。

【问题讨论】:

【参考方案1】:

由于您的 Access 数据库中以其他形式运行的代码遇到无法解释的崩溃,您的数据库中很可能存在“轻微”损坏的表单。我建议尝试decompile 数据库文件。

您可以从以下地址获取有关/decompile 开关的更多信息:

How to Decompile a Database

Decompile Your Microsoft Access Database

我会制作数据库的备份副本,然后进行反编译,然后进行压缩。然后打开数据库并打开您的 VBA 编辑器并编译您的代码。然后测试一下。

/decompile 开关过去为我解决了许多与 Microsoft Access 数据库有关的奇怪问题。

关于您希望记录或跟踪有关崩溃原因的更多详细信息,很遗憾,您无法这样做。 Microsoft Access 中的 VBA 无法拦截 Microsoft Access 可执行文件本身的错误或崩溃。

试试/decompile

【讨论】:

我已经尝试了 3 次...仍然崩溃。所以我猜这不是我的VBA问题。谢谢 您是否尝试过创建一个新的空数据库文件并从旧文件中导入所有对象(表/查询/表单/等)?如果您有一个拆分数据库,还要为数据创建一个新文件并导入所有内容。有时将所有对象导入新文件是删除或发现损坏对象的唯一方法。您的 VBA 代码没有任何问题,我仍然认为问题是对您数据库中的对象的某种损坏。 有机会我会试试的。 可悲的是,仍然崩溃。但是,大小确实下降了 300k 并且发生了变化……所以有些东西被遗漏了。但它仍然崩溃。【参考方案2】:

您没有要编辑的记录。 想想你在什么唱片上。

【讨论】:

不,记录保持不变。它只是在记录中的字段上更改。绝对不是 EOF 问题。 这不是 EOF,我认为 Access 不知道您在什么记录上。但可以肯定的是,我们需要更多信息。就像所涉及的表格和表格一样。 如果这是真的,为什么它可以在其他 2 种形式上正常工作,而在完全相同的记录上却有一半的时间?记录集被传入,并在rs.edit 命令处崩溃……到那时,记录完全没有变化。如果 Access 不知道它应该在什么记录上......表单和功能如何工作?我试图了解这可能是什么问题......【参考方案3】:

我终于想出了如何阻止崩溃!

出于某种原因,Access 偶尔会因为将记录集传递给模块而大发雷霆。

它运行良好(意味着按预期运行,没有崩溃)数周......然后突然开始崩溃。它也没有持续崩溃。一个按钮非常一致,因为它会一次工作,然后崩溃下一次......然后下一次工作,然后崩溃。

我已经开始为表单记录传递 PK,然后在模块中创建一个由传递的值过滤的记录集。从那时起,我一直能够在没有崩溃的情况下工作。

感谢大家提供的选项...我清楚地减少了一些不需要包含在反编译器中并使用新的 DB shell 的垃圾。

【讨论】:

以上是关于如何跟踪 Access 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

通过 Excel 用户窗体编辑 Access 数据库时跟踪更改(创建审计跟踪)

JVM 崩溃 - “EXCEPTION_ACCESS_VIOLATION”

关闭时访问崩溃

NSLayoutConstraint VFL 因为 EXC_BAD_ACCESS 而崩溃

iOS 崩溃 - 异步 UIImageView setImage EXC_BAD_ACCESS

崩溃:“线程 1:EXC_BAD_ACCESS”?