2014-10-06 65 views
2
dbs.Execute " INSERT INTO Log " _ 
    & "(UserName, DateAccessed) VALUES " _ 
    & "(@GetLogonName, @Today);" 

GetLogonName和Today是变量,但我得到错误“错误 - 太少的参数,预期两个”。如果我用实际值像&“(‘ABCE’,‘2012/2/2’),它的工作原理运行的功能。MS Access参数化查询VB

我在做什么错?

感谢

+4

显示的代码,其中你传递参数值。如果你从不传递参数值,那么你已经知道问题在哪里了。 – 2014-10-06 20:20:02

+0

你可以在VBA中做这种变量替换吗?我想你可能需要在(“&GetLogonName&”,“&Today&”)中连接它们。 – 2014-10-06 21:17:06

+0

@ScottHarris这不是一个替代,这是一个参数化查询。它们被用来避免串联,SQL注入攻击,它允许和性能打它招致 – 2014-10-07 10:25:52

回答

3

Database.Execute不接受查询参数,仅在RecordsetOptionEnum定义的执行选项

运行参数化查询,你需要创建一个QueryDef对象:

Dim query As QueryDef 
Set query = dbs.CreateQueryDef("", "INSERT INTO LOG (UserName,DateAccessed)" & _ 
             " VALUES(@user,@time)") 
query.Parameters("@user").Value = "Moo" 
query.Parameters("@time").Value = Now 
query.Execute 

空字符串表示这是一个临时QueryDef。如果您输入任何其他名称,或完全省略名称,则会在数据库中创建一个新的Query对象。

如果使用相同的查询频繁,这是一个好主意,以创建一个查询,并通过名字来称呼它:

Set query = dbs.QueryDefs("myQueryName") 
... 

QueryDef.Execute接受相同的执行参数Database.Execute

+1

字符串连接ISN与将参数传递给查询相同 - 实际上是相反的。即使Access为每个参数化查询创建一个新的执行计划,处罚也与执行原始语句相同。如果它缓存计划,你*避免*重新编译。另外,您避免了类型转换和注入。字符串连接是一个非常昂贵的习惯,这就是为什么它皱起了眉头 – 2014-10-08 12:20:12