【问题标题】:Too few parameters. (1) expected参数太少。 (1) 预期
【发布时间】:2015-06-26 18:46:05
【问题描述】:

我正在使用 VBA 将参数传递给存储的查询,但不断收到错误消息。这是存储的查询:

PARAMETERS Parm1 Long;
UPDATE tJ010_SRP4Codes INNER JOIN tZ100_VendorProfiles 
ON tJ010_SRP4Codes.SRP4Code = tZ100_VendorProfiles.JdeSRP4Code 
SET tJ010_SRP4Codes.Vendor = 'TEST'
WHERE ((([Parm1]=tZ100_VendorProfiles.VendorID)));

这是调用查询的 VBA:

Dim Parm1 As Long
db.QueryDefs(!QueryName).Parameters(Parm1) = intVdrProfileID
db.Execute !QueryName, dbFailOnError

我尝试过在存储查询中使用和不使用“Parameters...”行。两种方式都相同的错误。 存储的查询本身就可以正常工作,只是从 VBA 调用时不行。

【问题讨论】:

    标签: sql ms-access parameters vba


    【解决方案1】:

    使用DAO.QueryDef 对象,提供参数值,然后执行QueryDef

    Dim qdf As DAO.QueryDef
    Set qdf = db.QueryDefs(!QueryName)
    qdf.Parameters("Parm1").Value = intVdrProfileID
    qdf.Execute dbFailOnError
    

    Parameters("Parm1") 表示名为 Parm1 的参数。如果没有引号 Parameters(Parm1),Access 会将 Parm1 解释为一个变量。如果您没有这样的变量,则会引发错误。

    也可以通过数字而不是名称来识别参数。编号是从零开始的,所以Parameters(0) 表示第一个参数。

    注意我假设!QueryName 是一个记录集值并且是一个已保存查询的名称。而且我不知道 intVdrProfileID 来自哪里,但假设它对参数值有效。

    【讨论】:

    • 在 "Parm1" 周围添加双引号并添加 ".value" 并没有什么坏处,但是将 "db.execute" 更改为 "qdf.execute" 使一切正常。
    • 使用Dim Parm1 As LongParm1 被初始化为零。然后,如果您以后不为其分配不同的值,Parameters(Parm1) 将与 Parameters(0) 相同,所以是的,这在这种情况下可以工作,但我不相信这就是您对 Parm1 的真正含义。如果这就是您一直以来的意图,我认为首先使用 Parameters(0) 可能不会那么混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多