在 Database.Execute 中传递值返回错误 3061

Posted

技术标签:

【中文标题】在 Database.Execute 中传递值返回错误 3061【英文标题】:Passing values in Database.Execute returns an error 3061 【发布时间】:2019-12-30 20:24:19 【问题描述】:

我将下面的代码分配给一个命令按钮。

它返回一个错误 (3061)。

CurrentDb.Execute "INSERT INTO tblVerlof(Aanmaakdatum, VerlofDatum, VerlofReden, Aantal, me.VerlofPoule, Notitie, Status)VALUES(now(), me.startdatum, 2, me.txturen, me.verlofpoule, me.txttitel, 2)"

【问题讨论】:

您应该在问题中包含完整的错误消息。当然,请查看该错误的含义。看来这是您应该能够自己获得的。 这能回答你的问题吗? Run-time error '3061'. Too few parameters. Expected 1. (Access 2007) 【参考方案1】:

multiple ways 在 MS Access VBA 中运行操作查询,对于Database.Execute,您不能直接在 SQL 中传递表单值,应避免将 VBA 中的值连接到 SQL 中。

相反,考虑使用DoCmd.OpenQueryQueryDefs.Execute 将表单控件参数化为SQL 语句:

DoCmd.OpenQuery 方法

SQL (另存为查询对象)

INSERT INTO tblVerlof(Aanmaakdatum, VerlofDatum, VerlofReden, Aantal, 
                      VerlofPoule, Notitie, Status)
VALUES(NOW(), Forms!myform!startdatum, 2, Forms!myform!txturen, 
       Forms!myform!verlofpoule, Forms!myform!txttitel, 2)

VBA (无需关闭操作查询)

DoCmd.OpenQuery "mySavedQuery"

QueryDefs.Execute 方法

SQL(保存为查询对象,PARAMETERS子句在Access SQL中有效)

PARAMETERS prm_startdatum Date, prm_txturen Text,
           prm_verlofpoule Text, prm_txttitel Text;
INSERT INTO tblVerlof(Aanmaakdatum, VerlofDatum, VerlofReden, Aantal, 
                      VerlofPoule, Notitie, Status)
VALUES(NOW(), prm_startdatum, 2, prm_txturen, 
       prm_verlofpoule, prm_txttitel, 2)

VBA

Dim qdef As QueryDef

Set qdef = CurrentDb.QueryDefs("mySavedQuery")

qdef!prm_startdatum   = Me.startdatum
qdef!prm_txturen      = Me.txturen
qdef!prm_verlofpoule  = Me.verlofpoule
qdef!prm_txttitel     = Me.txttitel

qdef.Execute

Set qdef = Nothing

【讨论】:

【参考方案2】:

在列列表中:

(Aanmaakdatum, VerlofDatum, VerlofReden, Aantal, me.VerlofPoule, Notitie, Status)

什么是me.VerlofPoule? 这不是列名,对吧? 将其更改为正确的列名。

【讨论】:

【参考方案3】:

我在this question 中发现错误 3061 是“”运行时错误 '3061'。参数太少。”根据该问题的答案,插入列名可能是错误的。

查询似乎有一个名为me.VerlofPoule 的列。这也是应该进入此列的值。也许这应该是不同列的名称?

【讨论】:

【参考方案4】:

insert 语句中的第五列不是有效的字段名称:

CurrentDb.Execute "INSERT INTO tblVerlof(Aanmaakdatum, VerlofDatum, VerlofReden, Aantal, me.VerlofPoule, Notitie, Status)VALUES(now(), me.startdatum, 2, me.txturen, me.verlofpoule, me.txttitel, 2)"
                                                                         This field -----^

如果字段名称由表单上VerlofPoule 控件保存的值表示,则需要连接字段名称,因为在执行 SQL 语句时不会对其进行评估。

同样,values 子句中的 Me.XXX 项也不会被计算,相反,您应该使用参数或使用以下语法引用表单控件:Forms![YourForm]![YourControl]

【讨论】:

以上是关于在 Database.Execute 中传递值返回错误 3061的主要内容,如果未能解决你的问题,请参考以下文章

按值传递和返回结构(带有数组成员)

在 C# 中,我应该按值传递参数并返回相同的变量,还是按引用传递?

将函数返回值传递给存储过程参数

使用存储过程在“In”子句中传递多个值时查询不返回数据

Uipath 调用Vbs(含传递参数和返回值)

如何恢复传递给 multiprocessing.Process 的函数的返回值?