2014-10-06 98 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