MS Access用ADODB.Recordset填充列表框选中项后执行崩溃问题
解决Access列表框重新绑定Recordset时崩溃的问题
核心原因
当列表框存在选中项时,直接替换其Recordset属性,Access控件内部可能仍持有对旧记录集的引用,或是选中状态与新记录集的结构、数据产生冲突,进而导致无提示崩溃。
具体修复方案
方案1:重新绑定前清空选中状态并解除旧记录集绑定
修改代码,在设置新Recordset前先重置列表框状态,切断旧引用:
Dim CONSTRING As String Dim SQL As String Dim RSSQL As New ADODB.Recordset CONSTRING = "xxxxxxxxxx" ' 先清空选中项并解除旧记录集绑定 With Forms!Cockpit.LB .Value = Null Set .Recordset = Nothing End With SQL = "SELECT [ID], [Name] FROM [Table X] WHERE Name <>'' ORDER BY [Name] ASC;" RSSQL.Open SQL, CONSTRING, adOpenStatic, adLockBatchOptimistic, adCmdText Set Forms!Cockpit.LB.Recordset = RSSQL RSSQL.Close Set RSSQL = Nothing
方案2:改用RowSource绑定数据
如果业务场景允许,切换为通过SQL语句设置RowSource的方式,Access对这种绑定方式的控件状态管理更稳定:
Dim CONSTRING As String Dim SQL As String CONSTRING = "xxxxxxxxxx" SQL = "SELECT [ID], [Name] FROM [Table X] WHERE Name <>'' ORDER BY [Name] ASC;" With Forms!Cockpit.LB .Value = Null ' 清除选中项 .RowSourceType = "Table/Query" .RowSource = SQL .Requery ' 强制刷新数据 End With
方案3:调整记录集锁类型
原代码使用的adLockBatchOptimistic适用于批量更新场景,若不需要修改权限,改用更轻量的adLockReadOnly可减少控件与记录集的交互冲突:
RSSQL.Open SQL, CONSTRING, adOpenStatic, adLockReadOnly, adCmdText
额外注意事项
- 确保代码执行时,窗体和列表框控件已处于加载状态,避免引用未初始化的对象。
- 若使用32位Access,检查ADODB驱动与Office版本的兼容性,部分旧驱动可能存在此类绑定冲突问题。
内容的提问来源于stack exchange,提问作者aTuring
相关产品推荐
相关产品推荐

