【问题标题】:Using a Stored Procedure as a MS Access form Recordsource使用存储过程作为 MS Access 表单 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 在“结束于”之前,我收到一条错误消息,上面写着“无效使用属性”

【问题讨论】:

  • 这与调用 SP 的代码不同,因为我已经有了调用它的代码,但是,我需要将 SP 的结果作为 MS Access 表单的记录源。跨度>
  • 可能是参数无效。你能用和传查询一样的参数测试存储过程吗。

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


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    相关资源
    最近更新 更多