SQL Server 使用存储过程作为MS Access窗体记录源

tp5buhyn  于 2023-02-03  发布在  其他
关注(0)|答案(2)|浏览(193)

现在,我有一个数据库,有一个SQL Server后端和一个MS Access前端。在一个表单上,我的用户在显示它时遇到了加载时间很慢的问题。表单本质上是向上查找以查看用户是谁(基于他们的登录ID,这部分工作),查看他们的访问权限(只读、v. update等);这也行得通),然后根据他们的访问权限拉取允许他们查看的项目(这是我相信运行缓慢的部分)。
为了使这个表单加载得更快,我觉得将最后一部分,即拉取允许他们查看的项目的部分,移到SSMS存储过程中应该会使表单加载得更快。
我已经用SSMS编写了存储过程,并且有了调用存储过程的“Form Load”事件的代码。我面临的问题是使存储过程的结果成为窗体的RecordSource。我试过使用Me.RecordSource,但似乎不起作用。下面是调用存储过程的代码副本:

这与调用SP的代码不同,因为我已经有了调用它的代码,但是,我需要SP的结果作为MS Access窗体的记录源。

任何帮助或想法都将受到感谢!(eidogg.我想到尝试使用临时表作为记录源...)

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

如果我在“end with”之前放置:Set Me.RecordSource = rs 1,我会得到一条错误消息,说“属性的无效使用”

qzlgjiam

qzlgjiam1#

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

将以下代码添加到子窗体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
x1米11米1x
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
x1米20英寸1x
Set rs_tmp = Nothing
Set qdf = Nothing
End Sub

8zzbczxx

8zzbczxx2#

    • 解决方案1:**

将从存储过程返回的记录集分配给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

相关问题