在Microsoft Access的更新查询中,是否可以通过程序传递参数?

43

我有一个查询非常大,连接了十几个表,我想根据一个id字段(例如在nStartID和nEndID之间)返回记录。

我创建了两个参数并将它们作为条件进行了测试,效果很好。

问题是,我需要从这个主查询中运行一个插入查询,并且需要在主查询中使用这些参数。因此,我需要以编程方式传递参数。

有人知道如何实现吗?

谢谢。


1
我有一个解决方案满足我的需求,但不确定它是否是最好的。我为nStartID和nEndID创建了全局变量,然后为每个变量创建了一个函数,例如getStartID()和getEndID(),这些函数读取这些值。然后我只需在原始查询的where子句中使用这些函数。虽然不是最优雅的解决方案,但它能够工作。如果其他人有经验想要分享,以造福他人,我会保持开放态度。感谢您的帮助。 - Jav
5个回答

68
我刚测试了一下,它在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

谢谢分享,我找到了类似的代码,但没有这么好的解释。 - Jav
2
如果您在VBA中创建查询,这也可以工作;例如 Dim qdf As DAO.QueryDef; Set qdf = db.CreateQueryDef("", "UPDATE Members SET Members.age = [age]+1") - Nat

25

尝试使用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

3
我认为你也可以按编号引用 .Parameters,例如 qdf.Parameters(1).Value = "参数值"。不确定它是以零为基础的还是从一开始。 - iDevlop

4
非常感谢您提供关于使用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 一起使用。


3
您还可以使用TempVars - 注意,'!'语法是必需的。 您还可以使用TempVars - 注意,'!'语法是必需的

2
怎么使用这个? - HackSlash
这是一个很棒的解决方案。https://learn.microsoft.com/zh-cn/office/vba/api/access.tempvars - iDevlop

0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接