许多 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中文网其他相关文章!