【问题标题】:Access Run-time error '3061': Too few parameters. Expected 1访问运行时错误“3061”:参数太少。预计 1
【发布时间】:2014-04-06 17:52:35
【问题描述】:

我收到访问运行时错误:

'3061':参数太少。预计 1

尝试从带有子报表的表单运行某些 VBA 代码时。

我已经尝试在 SQL 查询中使用变量 (CurAssetID) 以及直接链接 (Forms!Details!ID),但两者都会导致相同的错误。我放入 MsgBox 只是为了验证它是否获得了正确的值。

如果我用一个值 (HAVING (((Assignments.AssetID)=1));") 替换 SQL 查询的最后一部分,它可以正常工作。这是怎么回事,我该如何解决?

Private Sub LineSelect_Click()
CurAssetID = Forms!Details!ID
Status = MsgBox(CurAssetID, vbOKOnly)
Dim LastAssignment As DAO.Recordset
LastAssignmentSQL = "SELECT Assignments.AssetID, Last(Assignments.LocationID) AS LastLocationID FROM Assignments GROUP BY Assignments.AssetID HAVING (((Assignments.AssetID)=CurAssetID));"
Set LastAssignment = CurrentDb.OpenRecordset(LastAssignmentSQL, dbOpenDynaset, dbSeeChanges)

【问题讨论】:

  • 你的 SQL 看不到你的 VBA 参数。

标签: sql vba ms-access


【解决方案1】:

您可以创建一个字符串变量,其中连接参数值:

curAssetID = Forms!Details!ID
status = MsgBox(CurAssetID, vbOKOnly)
Dim lastAssignment As DAO.Recordset
lastAssignmentSQL = "SELECT Assignments.AssetID, " & _
                    "Last(Assignments.LocationID) AS LastLocationID " & _
                    "FROM Assignments " & _
                    "GROUP BY Assignments.AssetID " & _
                    "HAVING (((Assignments.AssetID)=" & CurAssetID & "));"
Set lastAssignment = CurrentDb.OpenRecordset(lastAssignmentSQL, dbOpenDynaset, dbSeeChanges)
' ...

作为额外的预防措施,如果Forms!Details!ID 被假定为一个数字(IntegerLong),我建议您明确声明变量CurAssetID

Dim curAssetID as Integer ' Or Long
curAssetID = Forms!Details!ID
Dim lastAssignment As DAO.Recordset
lastAssignmentSQL = "SELECT Assignments.AssetID, " & _
                    "Last(Assignments.LocationID) AS LastLocationID " & _
                    "FROM Assignments " & _
                    "GROUP BY Assignments.AssetID " & _
                    "HAVING (((Assignments.AssetID)=" & CurAssetID & "));"
Set lastAssignment = CurrentDb.OpenRecordset(lastAssignmentSQL, dbOpenDynaset, dbSeeChanges)
' ...

如果该值为“字符串”,则应在查询中将该值括在引号中:

Dim curAssetID as String
' ...
lastAssignmentSQL = "SELECT Assignments.AssetID, " & _
                    "Last(Assignments.LocationID) AS LastLocationID " & _
                    "FROM Assignments " & _
                    "GROUP BY Assignments.AssetID " & _
                    "HAVING (((Assignments.AssetID)= '" & CurAssetID & "'));"
' ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多