如何实现MS Access传参数至SQL Server存储过程并完整显示结果集?
解决MS Access调用SQL Server存储过程后在数据表窗体显示完整结果集的问题
你的问题出在逐行赋值控件的方式完全不符合数据表窗体的工作逻辑——数据表窗体是用来批量显示记录集的,你循环给单个控件赋值的操作只会不断覆盖之前的内容,最终只留下最后一行数据。正确的做法是直接将存储过程返回的ADODB.Recordset绑定到窗体,让窗体自动渲染所有行。
修改后的完整代码
Private Sub btnBulkLink_Click() Dim cmd As New ADODB.Command Dim rst As New ADODB.Recordset With cmd .CommandType = adCmdStoredProc .ActiveConnection = "Driver=SQL Server Native Client 11.0;Server=xxxxxxxxxxxxxxxxx;Database=xxxxx;Trusted_Connection=Yes" .CommandText = "dbo.usp_FindResolutionsLinkedToServices" .CommandTimeout = 180 .NamedParameters = True End With cmd.Parameters.Append cmd.CreateParameter("@PprsRefINP", adLongVarChar, adParamInput, Len(txtBulkLink.Value), txtBulkLink.Value) ' 设置客户端游标,确保断开连接后窗体仍能保留数据 rst.CursorLocation = adUseClient Set rst = cmd.Execute ' 以隐藏模式打开窗体,避免界面闪烁 DoCmd.OpenForm FormName:="ServiceResolutionLink", View:=acFormDS, DataMode:=acFormReadOnly, WindowMode:=acHidden ' 将记录集直接绑定到窗体,这才是数据表窗体正确的数据源设置方式 Set Forms("ServiceResolutionLink").Recordset = rst ' 显示窗体 Forms("ServiceResolutionLink").Visible = True ' 不要在这里关闭记录集,窗体正在使用它;在窗体关闭时释放资源即可 End Sub
关键设置说明
- 窗体数据源清空:确保
ServiceResolutionLink窗体的**记录源(Record Source)**属性为空,避免和代码绑定的记录集冲突。 - 控件对应字段:窗体上的
txtPprsRef和txtSubmissionId控件,需将它们的**控件来源(Control Source)**分别设置为PprsRef和SubmissionId(必须和存储过程返回的字段名完全一致),这样绑定记录集后才能自动匹配显示。 - 客户端游标设置:添加
rst.CursorLocation = adUseClient是为了让记录集在本地缓存数据,即使断开与SQL Server的连接,窗体依然能完整显示所有结果。如果不设置,默认的服务器端游标会在记录集关闭后丢失数据。 - 资源释放:在
ServiceResolutionLink窗体的Close事件中添加以下代码,确保记录集资源被正确释放:
Private Sub Form_Close() If Not Me.Recordset Is Nothing Then Me.Recordset.Close Set Me.Recordset = Nothing End If End Sub
内容的提问来源于stack exchange,提问作者Matt Reeves
相关产品推荐
相关产品推荐

