【问题标题】:Ms-Access Open a Query Sourced from SQL Server stored procedureMs-Access 打开源自 SQL Server 存储过程的查询
【发布时间】:2015-10-28 16:12:40
【问题描述】:

我有一个 SQL Server 存储过程,它接受一些参数并返回记录。前端应用程序是 MS Access 2003。我有一个带有一些过滤器控件和一个执行按钮的表单。

当用户单击按钮时,我希望我的 VBA 代码使用提供的参数调用存储过程,然后使用 Docmd.OpenQueryDocmd.OpenTable 在网格中显示结果。

目前,我正在使用传递查询打开包含存储过程结果的记录集,然后循环通过记录集将每条记录插入到临时表中,然后使用DoCmd.OpenTable 打开该临时表。

这似乎不必要地复杂。我想完全避免使用临时表,如果可能的话,只需使用DoCmd.OpenQuery 在网格中显示记录。如果这不可能,我想找到一种方法将记录集中的记录一步插入到临时表中,而不是循环记录集。

编辑: 我之前曾尝试按照建议使用 DoCmd.OpenQuery 打开传递查询,但在执行 DoCmd.OpenQuery 行时收到“运行时错误 3270 - 未找到属性”。这让我相信直接打开通道是不可能的。这是我的代码版本的 sn-p:

sql = "EXEC dbo.rptContractorBidSummary " & IIf(frmClosedProjectWindow.Value = 1, "1", IIf(frmClosedProjectWindow.Value = 2, "2", "NULL"))
Set qdef = CurrentDb.QueryDefs("qryContractorBidSummary")
qdef.Connect = "ODBC;DRIVER=SQL Server;SERVER=" & Cconst.SERVER_NAME & ";DATABASE=" & stDatabase & ";UID=" & stUsername & ";PWD=" & stPassword
qdef.sql = sql
qdef.ODBCTimeout = 1000
qdef.ReturnsRecords = True
Set qdef = Nothing
DoCmd.OpenQuery "qryContractorBidSummary"

编辑: 我终于能够让这种方法发挥作用。代码很好。问题原来是我没有在后端正确设置存储过程的权限。感谢您的帮助!

【问题讨论】:

    标签: sql-server ms-access


    【解决方案1】:

    您应该能够使用DoCmd.OpenQuery 打开已保存的传递查询。如果您需要在打开查询之前指定参数值,您可以修改其 QueryDef 对象的 .SQL 属性,例如,类似这样的内容(未经测试):

    Set cdb = CurrentDb
    Set qdf = cdb.QueryDefs("yourPassThroughQuery")
    qdf.SQL = "EXEC yourStoredProcedure " & yourParameterValue
    Set qdf = Nothing
    DoCmd.OpenQuery "yourPassThroughQuery"
    

    【讨论】:

    • 谢谢!这实际上是我尝试的第一件事,但我收到“运行时错误 3270 - 找不到属性”,这让我相信这种方法是不可能的。这是我的代码的 sn-p:code
    • @DowDrake: 哪一行给出了这个错误?请将其添加到您的问题中。
    • DoCmd.OpenQuery 行中出现错误。这是我的代码的 sn-p: Set qdef = CurrentDb.QueryDefs("qryContractorBidSummary") qdef.Connect = "ODBC;DRIVER=SQL Server;SERVER=" & Cconst.SERVER_NAME & ";DATABASE=" & stDatabase & "; UID=" & stUsername & ";PWD=" & stPassword qdef.sql = sql qdef.ODBCTimeout = 1000 qdef.ReturnsRecords = True Set qdef = Nothing DoCmd.OpenQuery "qryContractorBidSummary"
    • @DowDrake 请edit您的问题包含其他信息,而不是将其隐藏在答案中。
    • 对于丑陋的 sn-p 抱歉,我在每个代码行前插入了 4 个空格,但没有按预期工作。
    【解决方案2】:

    你为什么不直接用docmd.openquery打开passthru??我经常使用它。您还可以将通路设置为表单或报告的来源。就在调用它之前,您更改其.SQL 以符合您的条件。

    【讨论】:

      猜你喜欢
      • 2013-09-18
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      • 2017-09-06
      • 1970-01-01
      • 2012-09-06
      相关资源
      最近更新 更多