許多 Microsoft Access 開發人員由於缺乏對如何正確使用參數的理解,而依賴易受攻擊的程式碼。本簡短指南將力求闡明此主題。
Access 提供了一種獨特的方式,可以直接在 SQL 程式碼中引用窗體和報表中的值,在大多數情況下無需參數:
<code>DoCmd.RunSQL "INSERT INTO Table1(Field1) SELECT " & _ "Forms!MyForm!MyTextbox" '插入单个值</code>
TempVars 提供了一種儲存和重複使用多個查詢的值的方法:
<code>TempVars!MyTempVar = Me.MyTextbox.Value DoCmd.RunSQL "INSERT INTO Table1(Field1) SELECT " & _ "Field1 FROM Table2 WHERE ID = TempVars!MyTempVar"</code>
UDF 可用於儲存和檢索值:
<code>Option Compare Database Option Explicit Private ThisDate As Date Public Function GetThisDate() As Date If ThisDate = #12:00:00 AM# Then ' 设置默认值。 ThisDate = Date End If GetThisDate = ThisDate End Function Public Function SetThisDate(ByVal NewDate As Date) As Date ThisDate = NewDate SetThisDate = ThisDate End Function '设置值: SetThisDate SomeDate</code>
DoCmd.SetParameter 允許為 DoCmd.OpenForm、DoCmd.OpenReport 和一些其他 DoCmd 語句設定參數:
<code>DoCmd.SetParameter "MyParameter", Me.MyTextbox DoCmd.OpenForm "MyForm",,, "ID = MyParameter"</code>
在 DAO 中,我們可以使用 DAO.QueryDef 物件來建立查詢並在開啟記錄集或執行查詢之前設定參數:
<code>'执行查询,未命名参数 With CurrentDb.CreateQueryDef("", "INSERT INTO Table1(Field1)" & _ " SELECT Field1 FROM Table2 WHERE Field1 = ?p1 And " & _ "Field2 = ?p2") .Parameters(0) = Me.Field1 .Parameters(1) = Me.Field2 .Execute End With '打开记录集,命名参数 Dim rs As DAO.Recordset With CurrentDb.CreateQueryDef("", "SELECT Field1 FROM Table2" & _ " WHERE Field1 = FirstParameter And Field2 = " & _ "SecondParameter") .Parameters!FirstParameter = Me.Field1 '感叹号表示法 .Parameters("SecondParameter").Value = Me.Field2 '更明确的表示法 Set rs = .OpenRecordset End With</code>
在 ADO 中,我們可以使用 ADODB.Command 物件來建立參數並將其附加到 Command.Parameters 集合:
<code>'执行查询,未命名参数 Dim cmd As ADODB.Command Set cmd = New ADODB.Command With cmd Set .ActiveConnection = CurrentProject.Connection '使用与当前数据库的连接 .CommandText = "INSERT INTO Table1(Field1) SELECT " & _ "Field1 FROM Table2 WHERE Field1 = ? And Field2 = ?" .Parameters.Append .CreateParameter(, adVarWChar, adParamInput, Len(Me.Field1), Me.Field1) 'adVarWChar 用于可能包含 Unicode 的文本框 .Parameters.Append .CreateParameter(, adInteger, adParamInput, 8, Me.Field2) 'adInteger 用于整数(长整数或整数) .Execute End With '打开记录集,隐式参数 Dim rs As ADODB.Recordset Dim cmd As ADODB.Command Set cmd = New ADODB.Command With cmd Set .ActiveConnection = CurrentProject.Connection '使用与当前数据库的连接 .CommandText = "SELECT Field1 FROM Table2 WHERE " & _ "Field1 = @FirstParameter And Field2 = @SecondParameter" Set rs = .Execute(,Array(Me.Field1, Me.Field2)) End With</code>
透過遵循這些方法,開發人員可以消除 SQL 注入漏洞並提高 Access 應用程式的安全性。
以上是如何安全地使用 VBA 中的參數進行 Microsoft Access 查詢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!