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