使用存储过程作为 MS Access 表单 Recordsource
Posted
技术标签:
【中文标题】使用存储过程作为 MS Access 表单 Recordsource【英文标题】:Using a Stored Procedure as a MS Access form Recordsource 【发布时间】:2016-07-27 18:00:05 【问题描述】:现在,我有一个数据库,带有一个 SQL Server 后端和一个 MS Access 前端。在一种形式上,我的用户正在经历缓慢的加载时间来显示它。该表单本质上是查看用户是谁(根据他们的登录 ID,这部分有效),查看他们的访问权限(只读、v.更新等;这也有效),然后拉取他们被允许的项目根据他们的访问权限查看(这是我认为运行缓慢的部分)。
为了让这个表单加载得更快,我觉得将最后一部分,即拉取他们允许查看的项目的部分移动到 SSMS 存储过程应该可以加快表单的加载速度。
我在 SSMS 中编写了存储过程,并且我在调用存储过程的“表单加载”事件上有代码。我面临的问题是让存储过程的结果成为表单的记录源。我试过 Me.RecordSource,但这似乎不起作用。下面是调用存储过程的代码副本:
这与调用 SP 的代码不同,因为我已经有了调用它的代码,但是,我需要 SP 的结果作为 MS Access 表单的记录源。
任何帮助或想法将不胜感激! (例如,我想尝试使用临时表作为记录源...)
Dim rs1 As ADODB.Recordset
Dim cmd As ADODB.Command
Dim prm As ADODB.Parameter
cn.ConnectionString = "DRIVER=SQL Server;SERVER=SERVERNAME;APP=Microsoft Office XP;WSID=MYCOMPUTER;DATABASE=dbname;Trusted_Connection=Yes;"
cn.Open
Set cmd = New ADODB.Command
Set rs1 = New ADODB.Recordset
With cmd
.ActiveConnection = cn
.CommandType = adCmdStoredProc
.CommandText = "dbo.ProcProjectSelection"
Set prm = .CreateParameter("@xID", adVarChar, adParamInput, 10, Me.txtNetworkID)
.Parameters.Append prm
End With
如果我输入: 设置 Me.RecordSource = rs1 在“结束于”之前,我收到一条错误消息,上面写着“无效使用属性”
【问题讨论】:
MS Access call SQL Server stored procedure的可能重复 这与调用 SP 的代码不同,因为我已经有了调用它的代码,但是,我需要将 SP 的结果作为 MS Access 表单的记录源。跨度> 可能是参数无效。你能用和传查询一样的参数测试存储过程吗。 【参考方案1】:解决方案 1:
将从存储过程返回的Recordset赋值给Form.Recordset对象
在代码末尾添加这一行
Set Me.Recordset = cmd.Execute
解决方案 2:
您可以创建基于ODBC数据源的直通查询,并将其用作记录源
然后,在表单的属性表中,设置属性:
record source = your_pass_through_query
recordset type = dynamic
编辑:
我的建议使用解决方案 2 来避免 ado 和运行时错误的许多设置
示例:通过使用 northwind 和存储过程
将表单中的控件与查询结果集的字段名称绑定
Private Sub Form_Open(Cancel As Integer)
test
End Sub
Sub test()
Dim qdf As DAO.QueryDef, rst As DAO.Recordset
Set qdf = CurrentDb.CreateQueryDef("")
qdf.Connect = "ODBC;Driver=SQL Server;Server=xxxx;database=northwind;Trusted_Connection=Yes;"
' stored procedure with paramete
qdf.SQL = "exec [CustOrderHist] 'ALFKI'"
qdf.ReturnsRecords = True
Set rst = qdf.OpenRecordset
Set Me.Recordset = rst
End Sub
【讨论】:
感谢您的帮助...非常感谢。当我运行它时,我的表单中没有任何结果(当我转到设计视图/属性时,记录源为空白)。我确实希望在运行它时得到结果。 (这是解决方案 1)。 我建议使用解决方案 2,因为您可以使用 recordsource 属性。例如,我编辑我的答案。【参考方案2】:解决办法:
使用传递查询将数据从存储过程获取到子表单
将以下代码添加到您的 SubForm RecordSource 字段Select * from YourPassThruQueryName
在你的 Form_Load()Dim qdf as DAO.QueryDef
Set qdf = CurrentDb.QueryDefs("YourPassThruQueryName") ' If it exist
Set qdf = CurrentDb.CreateQueryDef("YourPassThruQueryName") ' If you have to create one
您必须有一个默认的 Select 语句,因此请使用以下内容:qdf.sql = "Select * from anyTable where 0=1"
Set qdf = Nothing
重要!
您必须使用以下代码来刷新您的子表单,因为重新查询将不起作用:Me.frm_Your_Sub_Form_Name.SourceObject = "frm_Your_Actual_Sub_Form_Name"
Final!
在提交按钮中进行存储过程所需的选择时,请使用以下内容更新子表单:Private Sub btn_Submit_Click()
Dim rs_tmp as DAO.Recordset
Dim qdf as DAO.QueryDef
@987654331 @sp = "EXEC DBO.USP_Your_SQL_Server_Stored_Procedure_Name '" & prevdate & "','" & currdate & "'"
Set qdf = CurrentDb.QueryDefs("YourPassThruQueryName")
qdf.Connect = adoConnectionString ' This is your Connection string for SQL Server
qdf.sql = sp
qdf.ReturnsRecords = True
Set rs_tmp = qdf.OpenRecordset
If Not rs_tmp.EOF Then
Me.frm_Your_Sub_Form_Name.SourceObject = "frm_Your_Actual_Sub_Form_Name"
rs_tmp.Close
End If
Set rs_tmp = Nothing
Set qdf = Nothing
End Sub
【讨论】:
以上是关于使用存储过程作为 MS Access 表单 Recordsource的主要内容,如果未能解决你的问题,请参考以下文章
使用单个表单组合框中的多列作为 MS Access 中的查询参数
使用脚本字典在 MS Access 中存储对象以避免循环引用并允许表单知道其所有者对象