使用存储过程作为MS Access表单来源

时间:2016-07-27 18:00:06

标签: sql sql-server ms-access stored-procedures

现在,我有一个数据库,一个SQL Server后端和一个MS Access前端。在一种形式上,我的用户正在经历加载时间较慢的显示。表单基本上是查看用户是谁(基于他们的登录ID,这部分有效),查看他们的访问权限(readonly,v。更新等;这也有效),然后拉出他们允许的项目根据他们的访问权限来看(这是我认为运行缓慢的部分)。

为了使这个表单加载速度更快,我觉得将最后一部分(即允许他们看到的项目的部分)移动到SSMS存储过程应该可以更快地加载表单。

我在SSMS中编写了存储过程,并且我在“表单加载”中有代码。调用存储过程的事件。我面临的问题是让存储过程的结果成为表单的Recordsource。我已经尝试了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 在"结束"之前,我收到一条错误消息,说“&34;无效使用财产"

2 个答案:

答案 0 :(得分:1)

解决方案1:

将从存储过程返回的Recordset分配给Form.Recordset Object

在代码末尾添加此行

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 :(得分:0)

解决方案: 使用传递查询将数据从存储过程获取到子窗体中

将以下代码添加到您的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"

最终!
在“提交”按钮中进行存储过程所需的选择时,请使用以下内容更新子表单:

Private Sub btn_Submit_Click()
Dim rs_tmp as DAO.Recordset
Dim qdf as DAO.QueryDef
Dim sp as String
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