【问题标题】:VBA OpenRecordset Produces Error 3061VBA OpenRecordset 产生错误 3061
【发布时间】:2015-05-22 02:16:27
【问题描述】:
databasename = "qryDataExport"
Dim grpfield As String
grpfield = "Group"

Dim keys As DAO.Recordset
groupcmd = "SELECT [" & databasename & "].[" & grpfield & "] FROM [" & databasename & "] GROUP BY [" & databasename & "].[" & grpfield & "]"
Set keys = CurrentDb.OpenRecordset(groupcmd, dbOpenSnapshot)

以上产生“错误 3061:参数太少。预期为 13。”运行时。到目前为止,我的阅读强烈暗示这可能是不正确的字段标题的拼写问题或由定义 groupcmd 的行中的不正确引用引起的问题。

我尝试了以下数据库名称格式:

CurrentDb.Queries.qryDataExport
CurrentDb!Queries!qryDataExport

还有上面的"qryDataExport"。后两个不提供错误消息,而第一个不编译。我已经确认在主表和 qryDataExport 中都有一个标题为 Group 的列。

正在使用的模块来自this Google Code page

(编辑:截至此时的完整编辑模块:http://pastebin.com/TJip86ED

据我所见,我认为这是数据库名称定义中一个非常明显的格式错误,但我没有足够的 VBA 经验来发现它,而且我的想法已经不多了。任何建议将不胜感激。

EDIT2:generateKML() 的内容现在位于ExportToKMLButton_Click() 中,其中ExportToKMLButtonDW_Form 表单上的一个按钮。当DW_Form打开时,查询qryDataExport是可用的,但是当窗体关闭时,查询会提示输入错误信息中提到的13个参数。

【问题讨论】:

  • 这是从您的代码中直接复制和粘贴的吗?你还有Option Explicit 在那个模块的顶部吗?此外,您的 qryDataExport 查询是否有可能期待您没有提供给它的参数?
  • 您是否尝试过在 groupcmd 上执行 debug.print,然后从 Access 获取输出并执行它以查看是否有效?
  • 另外,您是否尝试过自行运行“qryDataExport”以确保该查询实际运行?
  • 新增:该模块正在使用选项比较数据库,但不是选项显式。我想查询可能需要更多参数;我不是写它的人,老实说不知道如何检查参数要求。
  • OpiesDad: qryDataExport 在表单中运行良好(它有 16 个输入,所以我认为这不太可能)。

标签: ms-access vba


【解决方案1】:

听起来您的 qryDataExport 查询引用了 Access 表单上的控件,可能类似于这个...

SELECT *
FROM YourTable
WHERE some_field = Forms!Form1!YourTextBox

如果 Form1 已打开(在表单视图中),我可以从 Access 的查询设计器中运行该查询,它将解析对表单控件的引用。

但是,如果我尝试对 OpenRecordset 使用完全相同的查询,则不会解析引用,并且在这种情况下,Access 会将其解释为我没有为其提供值的参数。

对于具有多个控件引用的查询,您可以基于您的 SELECT 语句创建一个临时的 QueryDef,并循环其 Parameters 集合,为每个参数值提供参数的 Eval().Name最后调用QueryDef.OpenRecordset 方法来加载你的记录集:

Dim prm As DAO.Parameter
Dim qdf As DAO.QueryDef
Set qdf = CurrentDb.CreateQueryDef(vbNullString, groupcmd)
For Each prm In qdf.Parameters
    prm.Value = Eval(prm.Name)
Next
Set keys = qdf.OpenRecordset

【讨论】:

  • 看来已经做到了!我仍然收到错误 3061,但它现在在另一个 OpenRecordset 调用中;至少这里的代码干净利落。
【解决方案2】:

您使用 databasename 的方式是正确的 (databasename = "qryDataExport"),qryDataExport 很可能使用表单中的值过滤数据...这就是为什么当您独立执行查询时,查询会发现它缺少 13 个参数说的形式。

您可以在 Click() 事件中为表单中的按钮运行此过程,它应该可以工作。

【讨论】:

  • 恐怕这行不通。我复制了 generateKML() 子程序的内容(这是我之前调用的),作为触发按钮的 Click() 事件的唯一内容。这会导致相同的错误消息。
  • 能否关闭所有表单并尝试打开 qryDataExport,您会得到什么?
  • 这样操作确实提示输入13个参数。我想这将问题改变为如何从表单中检索这些值;我假设我需要将字段引用为 Forms!DW_Form!fieldname 以在 Click 事件中检索这些值,但我不确定如何处理来自那里的 groupcmd 分配。
  • 好吧,当您运行代码时,您必须打开该表单(DW_Form),正如我在答案中所说的一种方法是创建一个按钮以在 DW_Form 中导出并在正如我在应该有效的答案中所说的那样,该按钮的单击事件。
  • 这就是我现在所做的;从 DW_Form 上的 ExportToKMLButton 的 Click() 事件中触发方法(以前是 Sub generateKML)会导致 Set keys (...) 行上的错误 3061,如上例所示。 Click() 方法不带参数;这可能是问题的一部分吗?
猜你喜欢
  • 2017-12-01
  • 2022-01-07
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多