繁体   English   中英

是否可以在Microsoft Access更新查询中以编程方式传递参数?

[英]Is it possible to pass parameters programmatically in a Microsoft Access update query?

我有一个很大的查询,连接了十几个表,我想基于id字段( 例如between nStartID and nEndID

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

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

任何人都知道如何做到这一点?

谢谢。

我刚刚对此进行了测试,它可以在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]的参数,即使它们实际上是[MemberSubset]的参数,也可以从VBA代码运行[MemberSubsetUpdate]。 这些参数值“滴流”到需要的位置,并且该查询确实可以在没有人工干预的情况下工作:

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

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

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

您也可以使用TempVars-注意“!” 语法是必不可少的 您也可以使用TempVars-注意“!”语法是必不可少的

已经有很多回复,但是您可以使用以下方式:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM