Sql Access 2003 VBA:直接运行查询时有效,但从代码运行时出现运行时错误3061?

Sql Access 2003 VBA:直接运行查询时有效,但从代码运行时出现运行时错误3061?,sql,ms-access,vba,ms-access-2003,Sql,Ms Access,Vba,Ms Access 2003,因此,我有一个相对简单的查询,它正好有两个参数,其中一个参数从表单中提取一个long,并且只从单个表中选择记录,其中一个字段具有该值。(这是一个设计项目表,用户正在选择一个应列出其项目的设计师。) 如果我打开表单,然后手动打开查询,它就可以正常工作。如果有第二个表单(用查询结果填充列表框)尝试将记录集设置为与查询结果相等,则会失败,并出现“运行时错误“3061”。参数太少。应为1。” 如果我将参数设置为静态整数,例如3,它工作正常(但显然没有用)。为什么我的VBA代码无法从表单上的文本字段读取文

因此,我有一个相对简单的查询,它正好有两个参数,其中一个参数从表单中提取一个long,并且只从单个表中选择记录,其中一个字段具有该值。(这是一个设计项目表,用户正在选择一个应列出其项目的设计师。)

如果我打开表单,然后手动打开查询,它就可以正常工作。如果有第二个表单(用查询结果填充列表框)尝试将记录集设置为与查询结果相等,则会失败,并出现“运行时错误“3061”。参数太少。应为1。”

如果我将参数设置为静态整数,例如3,它工作正常(但显然没有用)。为什么我的VBA代码无法从表单上的文本字段读取文本,而Access本身显然可以读取

我的问题是:

SELECT [Project Request Log TABLE].Designer1, [Project Request Log TABLE].Priority, [Project Request Log TABLE].ProjectName, [Project Request Log TABLE].Manager, [Project Request Log TABLE].SME1, [Project Request Log TABLE].Priority, [Project Request Log TABLE].ProjectID
FROM Designers INNER JOIN [Project Request Log TABLE] ON Designers.ID = [Project Request Log TABLE].Designer1
WHERE ((([Project Request Log TABLE].Designer1)=[Forms]![frm_selectDesigner]![txtDesignerId]) AND (([Project Request Log TABLE].PercentComplete)<>1))
ORDER BY [Project Request Log TABLE].Designer1, [Project Request Log TABLE].Priority;
谢谢

编辑:选择设计器的窗体打开第二个窗体,上面的代码尝试在该窗体上打开记录集。原始frm_selectDesigner未关闭,单击“确定”时将隐藏,但仍保持打开状态

编辑2:如果我包括该行

DoCmd.OpenQuery "qryDesignerProjectPrioritySet"

查询将打开并具有正确的结果。如果下一行尝试将该查询的结果指定为如上所述的记录集,则会给出3601错误?我编写OpenRecordset命令的过程中一定有某种错误,对吗?

您可以在代码中这样设置参数(您还必须对查询进行调暗/设置):

OpenRecordset()
应该是一个简单的基本操作;我不明白当
DoCmd.OpenQuery“qryDesignerProjectPrioritySet”
起作用时为什么会失败。查看一个仅能尝试
OpenRecordset()
的最小过程会发生什么

将以下代码作为新的标准模块插入,并从VB编辑器的主菜单中运行Debug->Compile。假设编译时没有错误,则使用表单视图中打开的
frm\u selectDesigner
表单测试子组件。如果它没有编译,您可能需要添加对DAO或ACEDAO的引用

Option Compare Database
Option Explicit

Public Sub test_OpenRecordset()
Dim dbs As DAO.Database
Dim rst_projects As DAO.Recordset

Set dbs = CurrentDb
Set rst_projects = dbs.OpenRecordset("qryDesignerProjectPrioritySet", dbOpenDynaset)
rst_projects.Close
Set rst_projects = Nothing
Set dbs = Nothing
End Sub
如果它编译和运行时没有错误,请将该代码与失败的代码进行比较,看看是否可以发现差异,例如对象变量的声明和分配方式


如果这一努力没有带来解决方案,或者如果
test\u OpenRecordset
也抛出了同样的错误,那么我想建议的是。

恐怕不是一个非常令人满意的答案。我使用了查询中的SQL代码,只是替换了一个变量(它是基于表单行设置的),而不是让VBA尝试读取文本字段。我的最终代码如下所示:

designerToPrioritize = Me.designerList.Column(2, Me.designerList.ListIndex + 1)

    queryText = "SELECT [Project Request Log TABLE].Designer1, [Project Request Log TABLE].Priority, [Project Request Log TABLE].ProjectName, [Project Request Log TABLE].Manager, [Project Request Log TABLE].SME1, [Project Request Log TABLE].Priority, [Project Request Log TABLE].ProjectID"
    queryText = queryText & vbCrLf & "FROM Designers INNER JOIN [Project Request Log TABLE] ON Designers.ID = [Project Request Log TABLE].Designer1"
    queryText = queryText & vbCrLf & "WHERE ((([Project Request Log TABLE].Designer1)=" & **designerToPrioritize** & " AND (([Project Request Log TABLE].PercentComplete)<1)))"
    queryText = queryText & vbCrLf & "ORDER BY [Project Request Log TABLE].Designer1, [Project Request Log TABLE].Priority;"
'That should recreate my original query. Let's see how it works.
        Set rst_projects = dbs.OpenRecordset(queryText, dbOpenDynaset)
DesignerToPriorize=Me.designerList.Column(2,Me.designerList.ListIndex+1)
queryText=“选择[项目请求日志表].Designer1[项目请求日志表].Priority[项目请求日志表].ProjectName[项目请求日志表].Manager[项目请求日志表].SME1[项目请求日志表].Priority[项目请求日志表].ProjectID”
queryText=queryText&vbCrLf&“来自设计器内部联接设计器上的[Project Request Log TABLE]。ID=[Project Request Log TABLE]。设计器1”

queryText=queryText&vbCrLf&“其中((([Project Request Log TABLE].Designer1)=“&**DesignerOprioritize**&”和(([Project Request Log TABLE].PercentComplete))通过将查询条件放入代码中,我成功地避免了BASS运行时错误“3061”。Query1的SQL类似于:

SELECT * FROM tbl1 WHERE field1=[Forms]![form1]![txt1]
代码:

触发了运行时错误“3061”。我将query2写为:

SELECT * FROM tbl1
并将代码更改为:

dim txt1 as string
txt1=[Forms]![form1]![txt1]"
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("SELECT * FROM Query2 WHERE field1=" & txt1)

它工作得很好。

只是想澄清一下:
frm\u selectDesigner
表单在您尝试从另一个表单运行查询时是打开的,对吗?为什么我的VBA代码无法从表单上的文本字段读取文本,而Access本身显然可以?可能是因为VBA用于Access以外的上下文。[项目请求日志表].PercentComplete 1执行在“set qdef…”行停止,错误为“运行时错误”424:需要对象"。该代码包含复制粘贴的查询名称,如上所述,该名称在DoCmd.OpenQuery中正常工作。谢谢。好的,我摆弄了上面的代码并使其正常工作。调试。打印报告参数Forms!frm_selectDesigner!txtDesignerID为3。那么Access为什么抱怨缺少参数?我甚至从查询中删除了另一个参数为了确保不是那个错误,VBA自己说参数设置好了,然后抱怨参数丢失了!
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("Query1")
SELECT * FROM tbl1
dim txt1 as string
txt1=[Forms]![form1]![txt1]"
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("SELECT * FROM Query2 WHERE field1=" & txt1)