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

Posted

技术标签:

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

【问题讨论】:

MS Access call SQL Server stored procedure的可能重复 这与调用 SP 的代码不同,因为我已经有了调用它的代码,但是,我需要将 SP 的结果作为 MS Access 表单的记录源。跨度> 可能是参数无效。你能用和传查询一样的参数测试存储过程吗。 【参考方案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.QueryDefSet qdf = CurrentDb.QueryDefs("YourPassThruQueryName") ' If it existSet 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.RecordsetDim 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 Serverqdf.sql = spqdf.ReturnsRecords = TrueSet rs_tmp = qdf.OpenRecordsetIf Not rs_tmp.EOF ThenMe.frm_Your_Sub_Form_Name.SourceObject = "frm_Your_Actual_Sub_Form_Name"rs_tmp.CloseEnd IfSet rs_tmp = NothingSet qdf = NothingEnd Sub

【讨论】:

以上是关于使用存储过程作为 MS Access 表单 Recordsource的主要内容,如果未能解决你的问题,请参考以下文章

使用表单在 MS Access 数据库中存储 PDF

使用单个表单组合框中的多列作为 MS Access 中的查询参数

PHP 远程连接到 MS Access 2016 数据库

使用脚本字典在 MS Access 中存储对象以避免循环引用并允许表单知道其所有者对象

MS Access:数据表属性(作为子表单)- 表单未打开,错误:2489?

循环访问 MS Access 子窗体并获取列可见性