OpenRecordset代码中的参数太少

时间:2013-11-27 13:50:31

标签: sql vba ms-access access-vba

我有两组代码,它们是相同的我只是将变量更改为另一个存在的集合,现在我改变的那些我得到一个错误说“运行时错误'3061':参数太少。预期6 。“

这是更改后的代码:

  Dim rec As Recordset
    Dim db As Database
    Dim X As Variant
    Set db = CurrentDb
    Set rec = db.OpenRecordset("UnitMoreInfoQ")
    Const msgTitle As String = "Open Explorer"
    Const cExplorerPath As String = "C:\WINDOWS\EXPLORER.EXE"
    Const cExplorerSwitches As String = " /n,/e"
    cFilePath = rec("ProjFilePath")

它突出了这一行:

Set rec = db.OpenRecordset("UnitMoreInfoQ")

这是第一个代码:

Dim rec As Recordset
Dim db As Database
Dim X As Variant
Set db = CurrentDb
Set rec = db.OpenRecordset("ProjectMoreInfoQ")
Const msgTitle As String = "Open Explorer"
Const cExplorerPath As String = "C:\WINDOWS\EXPLORER.EXE"
Const cExplorerSwitches As String = " /n,/e"
cFilePath = rec("ProjFilePath")

如您所见,该行具有相同数量的参数:

Set rec = db.OpenRecordset("ProjectMoreInfoQ")

由于这个原因,这让我很困惑。如何解决此错误?

3 个答案:

答案 0 :(得分:2)

在测试数据库时,我没有得到与您相同的结果,但我仍然不明白其中的区别。但是,也许我们仍然可以得到一些尽管我感到困惑的东西。

该查询包含6个表单控件的引用,例如[Forms]![WorkOrderDatabaseF]![Text71]。虽然您在db.OpenRecordset("UnitMoreInfoQ")处遇到“太少参数”错误时确定表单已在表单视图中打开,但Access不会检索这些值并希望您提供它们。

因此修改代码以提供这些参数值。

Dim rec As DAO.Recordset
Dim db As DAO.database
Dim prm As DAO.Parameter
Dim qdf As DAO.QueryDef
Dim X As Variant
Set db = CurrentDb
'Set rec = db.OpenRecordset("UnitMoreInfoQ")
Set qdf = db.QueryDefs("UnitMoreInfoQ")
For Each prm In qdf.Parameters
    prm.value = Eval(prm.Name)
Next
Set rec = qdf.OpenRecordset(dbOpenDynaset) ' adjust options as needed

我将留下以下原始答案的其余部分,以防其他人尝试解决类似问题。但我最好的猜测是,此代码更改将为您提供所需的内容,如果该窗体在窗体视图中打开,应该可以工作。


在立即窗口中运行此语句。 (您可以使用 Ctrl + g 打开立即窗口。)

DoCmd.OpenQuery "UnitMoreInfoQ"

当Access打开查询时,它会要求您为其标识的第一个参数提供值。该参数的名称包含在参数输入对话框中。它会询问每个参数的值。

将这些“参数名称”与查询的SQL进行比较。一般来说,拼写错误。


使用数据库的副本,DoCmd.OpenQuery("UnitMoreInfoQ")会询问我6个参数。

以下是我在立即窗口中看到的内容:

? CurrentDb.QueryDefs("UnitMoreInfoQ").Parameters.Count
 6 

for each prm in CurrentDb.QueryDefs("UnitMoreInfoQ").Parameters : _
? prm.name : next
[Forms]![WorkOrderDatabaseF]![Text71]
[Forms]![WorkOrderDatabaseF]![ClientNameTxt]
[Forms]![WorkOrderDatabaseF]![WorkOrderNumberTxt]
[Forms]![WorkOrderDatabaseF]![TrakwareNumberTxt]
[Forms]![WorkOrderDatabaseF]![WorkOrderCompleteChkBx]
[Forms]![WorkOrderDatabaseF]![WorkOrderDueDateTxt]

运行此代码时,请确保在表单视图中打开名为 WorkOrderDatabaseF 的表单:

Set rec = db.OpenRecordset("UnitMoreInfoQ")

答案 1 :(得分:1)

[UnitMoreInfoQ]查询是否可以自行正确执行?如果您在访问中输入错误字段,则会将该字段视为参数。

答案 2 :(得分:0)

ProjectMoreInfoQ和UnitMoreInfoQ是不同的查询...听起来像一个需要6个参数而另一个不需要。查看Access中的查询,看看是否定义了参数。