dbs.Execute " INSERT INTO Log " _
& "(UserName, DateAccessed) VALUES " _
& "(@GetLogonName, @Today);"
GetLogonName和Today是变量,但我得到错误“错误 - 太少的参数,预期两个”。如果我用实际值像&“(‘ABCE’,‘2012/2/2’),它的工作原理运行的功能。MS Access参数化查询VB
我在做什么错?
感谢
dbs.Execute " INSERT INTO Log " _
& "(UserName, DateAccessed) VALUES " _
& "(@GetLogonName, @Today);"
GetLogonName和Today是变量,但我得到错误“错误 - 太少的参数,预期两个”。如果我用实际值像&“(‘ABCE’,‘2012/2/2’),它的工作原理运行的功能。MS Access参数化查询VB
我在做什么错?
感谢
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
字符串连接ISN与将参数传递给查询相同 - 实际上是相反的。即使Access为每个参数化查询创建一个新的执行计划,处罚也与执行原始语句相同。如果它缓存计划,你*避免*重新编译。另外,您避免了类型转换和注入。字符串连接是一个非常昂贵的习惯,这就是为什么它皱起了眉头 – 2014-10-08 12:20:12
显示的代码,其中你传递参数值。如果你从不传递参数值,那么你已经知道问题在哪里了。 – 2014-10-06 20:20:02
你可以在VBA中做这种变量替换吗?我想你可能需要在(“&GetLogonName&”,“&Today&”)中连接它们。 – 2014-10-06 21:17:06
@ScottHarris这不是一个替代,这是一个参数化查询。它们被用来避免串联,SQL注入攻击,它允许和性能打它招致 – 2014-10-07 10:25:52