如何跟踪Access崩溃

时间:2015-07-27 19:35:00

标签: vba ms-access recordset

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

该按钮在最后一个表单上每隔一段时间都可以正常工作,并在其他尝试时崩溃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 Error

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

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

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

3 个答案:

答案 0 :(得分:2)

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

您可以从以下网址获取有关/decompile切换的更多信息:

How to Decompile a Database

Decompile Your Microsoft Access Database

我会制作数据库的备份副本,然后做一个反编译,然后是一个紧凑的。然后打开数据库并打开VBA编辑器并编译代码。然后测试一下。

/decompile开关在过去为我修复了Microsoft Access数据库的许多奇怪问题。

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

尝试/decompile

答案 1 :(得分:0)

您没有要编辑的记录。 想想你现在的记录。

答案 2 :(得分:0)

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

出于某种原因,Access偶尔会将记录集传递给模块。

它工作正常(意思是预期而且没有崩溃)数周......然后突然开始崩溃。它也没有一直崩溃。一个按钮是非常一致的,因为它可以工作一次,然后崩溃下一个...然后下一次工作,并在那之后崩溃。

我已经开始为表单的记录传递PK,然后在模块中创建一个由传递的值过滤的记录集。从那以后,我一直没有崩溃。

感谢选项人员...我明确地减少了一些不需要被反编译包含并使用新数据库shell的垃圾。