【问题标题】:Is it possible to pass parameters programmatically in a Microsoft Access update query?是否可以在 Microsoft Access 更新查询中以编程方式传递参数?
【发布时间】:2013-05-10 05:25:59
【问题描述】:

我有一个相当大的查询,连接了十几个表,我想根据 id 字段拉回记录(例如between nStartID and nEndID)。

我创建了两个参数并将它们作为标准进行了测试,它们工作正常。

问题是,我需要从这个主查询运行插入查询,并且需要主查询中的参数。所以,我需要以编程方式将参数传递给它。

有人知道如何做到这一点吗?

谢谢。

【问题讨论】:

  • 我有一个满足我需要的解决方案,但不确定它是否是最好的。我为 nStartID 和 nEndID 创建了全局变量,然后为每个变量创建一个函数,如读取这些值的 getStartID() 和 getEndID() 。然后我只在原始查询的 where 子句中使用这些函数。不是最优雅的解决方案,但它确实有效。如果其他人有他们想分享的经验,我将保持开放状态,以造福他人。感谢您提供有用的意见。

标签: vba ms-access parameters ms-access-2010


【解决方案1】:

我刚刚对此进行了测试,它可以在 Access 2010 中使用。

假设您有一个带参数的 SELECT 查询:

PARAMETERS startID Long, endID Long;
SELECT Members.*
FROM Members
WHERE (((Members.memberID) Between [startID] And [endID]));

您以交互方式运行该查询,它会提示您输入 [startID] 和 [endID]。这行得通,因此您将该查询保存为 [MemberSubset]。

现在您基于该查询创建一个 UPDATE 查询:

UPDATE Members SET Members.age = [age]+1
WHERE (((Members.memberID) In (SELECT memberID FROM [MemberSubset])));

您以交互方式运行该查询,并再次提示您输入 [startID] 和 [endID],它运行良好,因此您将其保存为 [MemberSubsetUpdate]。

您可以通过将 [startID] 和 [endID] 值指定为 [MemberSubsetUpdate] 的参数从 VBA 代码运行 [MemberSubsetUpdate],即使它们实际上是 [MemberSubset] 的参数。这些参数值“涓涓细流”到需要它们的地方,并且查询确实可以在没有人为干预的情况下工作:

Sub paramTest()
    Dim qdf As DAO.QueryDef
    Set qdf = CurrentDb.QueryDefs("MemberSubsetUpdate")
    qdf!startID = 1  ' specify
    qdf!endID = 2    '     parameters
    qdf.Execute
    Set qdf = Nothing
End Sub

【讨论】:

  • 感谢分享,我找到了类似的代码,但没有任何解释。
  • 这也适用于在 VBA 中创建查询;例如Dim qdf As DAO.QueryDef; Set qdf = db.CreateQueryDef("", "UPDATE Members SET Members.age = [age]+1")
【解决方案2】:

尝试使用 QueryDefs。使用参数创建查询。然后使用这样的东西:

Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef

Set dbs = CurrentDb
Set qdf = dbs.QueryDefs("Your Query Name")

qdf.Parameters("Parameter 1").Value = "Parameter Value"
qdf.Parameters("Parameter 2").Value = "Parameter Value"
qdf.Execute
qdf.Close

Set qdf = Nothing
Set dbs = Nothing

【讨论】:

  • 我想你也可以按数字引用.Parameters,比如qdf.Parameters(1).Value = "Parameter Value"。不确定它是否基于零。
【解决方案3】:

非常感谢您提供有关使用 QueryDefs 集合的信息!我一直在想这个问题。

我使用包含查询参数的表以不同的方式进行操作,不使用 VBA。

例如:

SELECT a_table.a_field 
FROM QueryParameters, a_table 
WHERE a_table.a_field BETWEEN QueryParameters.a_field_min 
AND QueryParameters.a_field_max

其中QueryParameters 是一个包含两个字段的表,a_field_mina_field_max

如果您在GROUP BY 子句中包含查询参数字段,并且在HAVING 子句中的参数字段上包含FIRST 运算符,它甚至可以与GROUP BY 一起使用。

【讨论】:

    【解决方案4】:

    您也可以使用 TempVar - 注意 '!'语法是必不可少的

    【讨论】:

    【解决方案5】:

    已经有很多回复了,但你可以用这个:

    Sub runQry(qDefName)
        Dim db As DAO.Database, qd As QueryDef, par As Parameter
    
        Set db = CurrentDb
        Set qd = db.QueryDefs(qDefName)
    
        On Error Resume Next
        For Each par In qd.Parameters
            Err.Clear
            par.Value = Eval(par.Name)          'try evaluating param
            If Err.Number <> 0 Then             'failed ?
                par.Value = InputBox(par.Name)  'ask for value
            End If
        Next par
        On Error GoTo 0
    
        qd.Execute dbFailOnError
    End Sub
    
    Sub runQry_test()
        runQry "test"  'qryDef name
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2011-11-20
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      相关资源
      最近更新 更多