现在,我有一个数据库,一个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;无效使用财产"
答案 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