Access VBA如何获取SQL Server SEQUENCE下一个序列值
实现方案
在原有保存逻辑前插入序列取值代码,通过SQL Server连接执行SELECT NEXT VALUE FOR dbo.TestNumberSeq语句拿到下一个主键值,直接赋值给窗体绑定的TestNumber字段即可,既满足提前向用户展示新主键的需求,也能保证记录插入时主键值合法有效。
- 仅在新增记录时触发取值逻辑,编辑已有记录时跳过取值步骤,避免覆盖原有主键造成数据错误
- 优先复用Access前端已配置好的SQL Server连接,无需重复维护连接参数
- 赋值完成后主键值会直接显示在窗体控件上,不需要额外刷新窗体
修改后的完整VBA代码
Private Sub cmdSaveRecord_Click() Dim rs As ADODB.Recordset Dim nextSeqValue As Long On Error GoTo Err_cmdSaveRecord_Click ' 仅新增记录时获取序列值 If Me.NewRecord Then Set rs = New ADODB.Recordset ' 强制在SQL Server端执行序列取值语句 rs.Open "SELECT NEXT VALUE FOR dbo.TestNumberSeq", CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly nextSeqValue = rs(0).Value rs.Close Set rs = Nothing ' 给绑定的主键字段赋值,用户可直接在窗体看到生成的主键值 Me!TestNumber.Value = nextSeqValue End If ' 原有保存记录逻辑 DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70 cmdPrint.SetFocus Exit_cmdSaveRecord_Click: ' 清理资源 If Not rs Is Nothing Then If rs.State = adStateOpen Then rs.Close Set rs = Nothing End If Exit Sub Err_cmdSaveRecord_Click: MsgBox Err.Description Resume Exit_cmdSaveRecord_Click End Sub
前置说明:
- 使用前请在VBA编辑器的「工具-引用」中勾选
Microsoft ActiveX Data Objects对应版本的库,否则代码会报类型未定义错误- 请确认Access连接SQL Server使用的数据库账号,拥有对
dbo.TestNumberSeq序列的查询权限- 如果执行时提示SQL语法错误,是因为Access本地数据库引擎尝试解析SQL Server专属语法,此时将查询改为传递查询模式、强制在SQL Server端执行语句即可解决
内容的提问来源于stack exchange,提问作者Kevin Rahe
相关产品推荐
相关产品推荐

