为什么 运行-time error '3061'。参数太少。预期 1?访问 2010
Why Run-time error '3061'. Too few parameters. Expected 1? Access 2010
我已经研究了关于此的所有 Whosebug 问题,但无法使其工作。我有一个简单的 table:
还有一个表格:
我想从 table T:ActityRoster 和表单中的“Activity 日期”中提取字段,并将它们“添加”到 table T:ActivityHistory.
一位 Whosebug 专家帮助我编写了一些代码,但它甚至不会设置第一个 recordset:rsIn
Dim ActID As Integer, actDate As Date, val1 As Long, val2 As Long, val3 As Boolean, val4 As Currency
Dim db As Database, rsIn As Recordset, rsOut As Recordset
Dim strSQL As String
Set db = CurrentDb
ActID = Me.cboActivityName.Column(0)
strSQL = "SELECT * FROM T:ActivityRoster WHERE [ActivityID] = ActID"
Debug.Print strSQL
Set rsIn = db.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly)
rsIn.MoveLast
Set rsOut = db.OpenRecordset("T:AttendanceHistory", dbOpenDynaset, dbEditAdd)
rsOut.MoveLast
actDate = Me.ActivityDate.Value ' retrive the date from the form
With rsIn
.MoveFirst
Do
val1 = !ActivityID
val2 = !MemberID
val3 = !Attended
val4 = !AmtSpent
With rsOut
.AddNew
!ActivityDate = actDate
!ActivityID = val1
!MemberID = val2
!Attended = val3
!AmtSpent = val4
.Update
End With
.MoveNext
Loop Until .EOF
.Close
End With
rsOut.Close
Set rsIn = Nothing
Set rsOut = Nothing
Set db = Nothing
End Sub
我已验证所有字段名称均正确且数据类型一致。当我将查询放回 Access 时,它给出了预期的结果。
SELECT
语句包含 VBA 变量的名称 (ActID):
strSQL = "SELECT * FROM T:ActivityRoster WHERE [ActivityID] = ActID"
不幸的是,数据库引擎对该变量一无所知。因此,当它看到 ActID 时,它会假定这是您尚未为其提供值的参数的名称。
在构建 SELECT
语句时包含变量的值而不是变量的名称。使用以下两个示例之一:第一个 if [ActivityID]
是文本数据类型;或者第二个,如果它是数字数据类型:
strSQL = "SELECT * FROM [T:ActivityRoster] WHERE [ActivityID] = '" & ActID & "'"
strSQL = "SELECT * FROM [T:ActivityRoster] WHERE [ActivityID] = " & ActID
我将 table 名称括在方括号中,因为该名称包含标点符号。但是,如果可能的话,我会重命名 table。 T:AttendanceHistory 也一样。选择不包含标点符号和空格且不匹配 VBA 或 SQL 关键字的对象名称。
或者,您可以使用参数查询并使用 ActID:
提供参数值
strSQL = "SELECT * FROM [T:ActivityRoster] WHERE [ActivityID] = [which_ActivityID]"
Dim qdf As DAO.QueryDef
Set qdf = db.CreateQueryDef(vbNullString, strSQL)
qdf.Parameters("which_ActivityID").Value = ActID
Set rsIn = qdf.OpenRecordset(dbOpenSnapshot)
我的来源是一个查询,它有条件引用表单上的一个字段。摆脱了它,现在一切都好了。我在查询中的所有字段都是正确的名称等
有点老了,但我今天 运行 遇到了这个问题,需要一个不同的解决方案。所以希望这对以后遇到这个问题的人有所帮助。
我在创建新查询并尝试在 VBA:
中引用它时弹出此错误
Set rst = CurrentDb.OpenRecordset("SELECT * FROM qry_New WHERE [Field]='" & [RptField] & "'")
编译项目似乎解决了错误。 在 VB 编辑器中调试 > 编译 [项目名称]。
这也在 Access 2013 中,而不是 Access 2010 中,所以我不确定它是否适用于这个确切的场景。
我已经研究了关于此的所有 Whosebug 问题,但无法使其工作。我有一个简单的 table:
还有一个表格:
我想从 table T:ActityRoster 和表单中的“Activity 日期”中提取字段,并将它们“添加”到 table T:ActivityHistory.
一位 Whosebug 专家帮助我编写了一些代码,但它甚至不会设置第一个 recordset:rsIn
Dim ActID As Integer, actDate As Date, val1 As Long, val2 As Long, val3 As Boolean, val4 As Currency
Dim db As Database, rsIn As Recordset, rsOut As Recordset
Dim strSQL As String
Set db = CurrentDb
ActID = Me.cboActivityName.Column(0)
strSQL = "SELECT * FROM T:ActivityRoster WHERE [ActivityID] = ActID"
Debug.Print strSQL
Set rsIn = db.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly)
rsIn.MoveLast
Set rsOut = db.OpenRecordset("T:AttendanceHistory", dbOpenDynaset, dbEditAdd)
rsOut.MoveLast
actDate = Me.ActivityDate.Value ' retrive the date from the form
With rsIn
.MoveFirst
Do
val1 = !ActivityID
val2 = !MemberID
val3 = !Attended
val4 = !AmtSpent
With rsOut
.AddNew
!ActivityDate = actDate
!ActivityID = val1
!MemberID = val2
!Attended = val3
!AmtSpent = val4
.Update
End With
.MoveNext
Loop Until .EOF
.Close
End With
rsOut.Close
Set rsIn = Nothing
Set rsOut = Nothing
Set db = Nothing
End Sub
我已验证所有字段名称均正确且数据类型一致。当我将查询放回 Access 时,它给出了预期的结果。
SELECT
语句包含 VBA 变量的名称 (ActID):
strSQL = "SELECT * FROM T:ActivityRoster WHERE [ActivityID] = ActID"
不幸的是,数据库引擎对该变量一无所知。因此,当它看到 ActID 时,它会假定这是您尚未为其提供值的参数的名称。
在构建 SELECT
语句时包含变量的值而不是变量的名称。使用以下两个示例之一:第一个 if [ActivityID]
是文本数据类型;或者第二个,如果它是数字数据类型:
strSQL = "SELECT * FROM [T:ActivityRoster] WHERE [ActivityID] = '" & ActID & "'"
strSQL = "SELECT * FROM [T:ActivityRoster] WHERE [ActivityID] = " & ActID
我将 table 名称括在方括号中,因为该名称包含标点符号。但是,如果可能的话,我会重命名 table。 T:AttendanceHistory 也一样。选择不包含标点符号和空格且不匹配 VBA 或 SQL 关键字的对象名称。
或者,您可以使用参数查询并使用 ActID:
提供参数值strSQL = "SELECT * FROM [T:ActivityRoster] WHERE [ActivityID] = [which_ActivityID]"
Dim qdf As DAO.QueryDef
Set qdf = db.CreateQueryDef(vbNullString, strSQL)
qdf.Parameters("which_ActivityID").Value = ActID
Set rsIn = qdf.OpenRecordset(dbOpenSnapshot)
我的来源是一个查询,它有条件引用表单上的一个字段。摆脱了它,现在一切都好了。我在查询中的所有字段都是正确的名称等
有点老了,但我今天 运行 遇到了这个问题,需要一个不同的解决方案。所以希望这对以后遇到这个问题的人有所帮助。
我在创建新查询并尝试在 VBA:
中引用它时弹出此错误Set rst = CurrentDb.OpenRecordset("SELECT * FROM qry_New WHERE [Field]='" & [RptField] & "'")
编译项目似乎解决了错误。 在 VB 编辑器中调试 > 编译 [项目名称]。
这也在 Access 2013 中,而不是 Access 2010 中,所以我不确定它是否适用于这个确切的场景。