现在,我有一个数据库,有一个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,我会得到一条错误消息,说“属性的无效使用”
2条答案
按热度按时间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
8zzbczxx2#
将从存储过程返回的记录集分配给Form.Recordset对象
在代码末尾添加此行
可以基于ODBC数据源创建传递查询,并将其用作记录源
然后,在窗体的属性表中设置属性:
我的建议是使用解决方案2来避免许多ado设置和运行时错误
示例:使用northwind和存储过程进行传递
将窗体中的控件与查询结果集的字段名绑定