重新分配断开连接的ADODB记录集后MS Access崩溃问题求助
问题解决思路
核心原因
刷新窗体(F5或“全部刷新”)后,Access会尝试重置窗体的Recordset,但断开连接的ADODB Recordset与窗体的绑定关系在刷新后会出现引用冲突,此时在Form_Current中直接重新分配Recordset会触发内存访问错误导致崩溃。
解决方案
正确释放旧Recordset引用
在初始化新Recordset前,先关闭并释放已存在的myRecSet对象,避免内存中的无效引用冲突。替换Form_Current的触发逻辑
不要在Form_Current中初始化Recordset,改用自定义刷新按钮,或者拦截F5键替换默认刷新操作,控制Recordset的重建时机。
修改后的代码示例
Option Compare Database Dim myRecSet As ADODB.Recordset Private Sub Form_Open(Cancel As Integer) Init End Sub ' 拦截F5键,用自定义刷新替代默认操作 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyF5 Then KeyCode = 0 ' 阻止默认刷新 RefreshRecordset ' 执行自定义刷新 End If End Sub ' 自定义刷新按钮的点击事件(按需添加) Private Sub cmdRefresh_Click() RefreshRecordset End Sub Private Sub RefreshRecordset() ' 先释放旧的Recordset If Not myRecSet Is Nothing Then If myRecSet.State = adStateOpen Then myRecSet.Close End If Set myRecSet = Nothing End If ' 重新初始化 Init End Sub Private Sub Init() Set myRecSet = New ADODB.Recordset With myRecSet .Fields.Append "ID", adInteger, , adFldKeyColumn .Fields.Append "someText", adVarChar, 20, adFldMayBeNull .CursorType = adOpenKeyset .CursorLocation = adUseClient .LockType = adLockPessimistic .Open End With myRecSet.AddNew myRecSet.Fields(1) = "First text" myRecSet.Update myRecSet.AddNew myRecSet.Fields(1) = "Second text" myRecSet.Update Set Me.Recordset = myRecSet End Sub ' 窗体关闭时释放Recordset,避免内存泄漏 Private Sub Form_Close() If Not myRecSet Is Nothing Then If myRecSet.State = adStateOpen Then myRecSet.Close End If Set myRecSet = Nothing End If End Sub
关键说明
- 拦截F5键后,默认的窗体刷新操作被禁用,改用自定义的
RefreshRecordset方法,确保旧Recordset被完全释放后再创建新的绑定。 - 作为子窗体使用时,只需在父窗体的刷新逻辑中调用子窗体的
RefreshRecordset方法即可,无需关闭重开父窗体。
内容的提问来源于stack exchange,提问作者Ілля Марко
相关产品推荐
相关产品推荐

