Access绑定窗体列表框选记录跳转报错误2105问题咨询
问题场景
有一个绑定至SQL Server数据表的Access窗体,窗体上设置了1个列表框,用于拉取表中去重后的贷款编号。该列表框共2列,第一列存储数据表主键(PK)、第二列存储贷款编号。
原有VBA代码实现逻辑为:用户点击列表框选项时,在绑定窗体上加载选中的对应记录,方便用户编辑,代码如下:
Private Sub lst_LocalLoanNumberList_Click() DoCmd.GoToRecord acDataForm, "frm_LocalLoanInfo", acGoTo, Me.lst_LocalLoanNumberList.Column(0) End Sub
该功能此前运行正常,在未修改任何代码的情况下突然失效,触发错误2105,提示:"You can't go to the specified record."(无法转到指定记录)。
问题根因
原代码存在本质的API用法错误:DoCmd.GoToRecord方法在传入acGoTo参数时,最后一个偏移位参数要求传入的是当前窗体绑定记录集内从1开始计数的相对行序号,并非数据表的主键值。
此前功能可正常运行完全是巧合:早期表内数据量小,主键为从1开始连续无断号的自增整数,且窗体无筛选、无自定义排序,记录集加载后的行序号刚好和主键值一一对应。只要出现以下任意一种情况,主键值和行号的匹配关系就会断裂,直接触发2105错误:
- 表内删除过历史记录,主键出现断号
- SQL Server自增主键因事务回滚、批量插入跳过值等原因出现数值跳跃
- 窗体加载时应用了筛选、自定义排序规则,记录顺序和主键升序顺序不一致
- 新增记录的主键值大于当前窗体记录集的总行数,跳转位置超出记录集范围
修复方案
使用记录集书签定位的方案替代原有行号跳转逻辑,该方案不受记录排序、筛选、主键断号影响,稳定性远高于原实现,修复后代码如下:
Private Sub lst_LocalLoanNumberList_Click() Dim rs As DAO.Recordset ' 列表框无选中值时直接退出 If IsNull(Me.lst_LocalLoanNumberList.Value) Then Exit Sub Set rs = Me.RecordsetClone ' 注意:将下方代码中的[PK_FieldName]替换为你表中实际的主键字段名 ' 数字主键用下方写法即可 rs.FindFirst "[PK_FieldName] = " & Me.lst_LocalLoanNumberList.Column(0) ' 如果主键是字符串类型,注释掉上一行,改用下方写法(自动处理值内的单引号转义) ' rs.FindFirst "[PK_FieldName] = '" & Replace(Me.lst_LocalLoanNumberList.Column(0), "'", "''") & "'" If Not rs.NoMatch Then Me.Bookmark = rs.Bookmark End If rs.Close Set rs = Nothing End Sub
额外排查项:如果替换代码后仍报错,需检查:
- 窗体是否被设置为数据输入模式、只读模式,导致记录集无法正常定位
- SQL Server端对应表的主键是否存在空值、列表框查询是否因账号权限问题拉取到了无效主键值
- 列表框第一列是否确实绑定了主键值,有没有因为列宽设置为0导致取值错位
内容的提问来源于stack exchange,提问作者Stormer
相关产品推荐
相关产品推荐

