首頁 >資料庫 >mysql教程 >如何安全地使用 VBA 中的參數進行 Microsoft Access 查詢?

如何安全地使用 VBA 中的參數進行 Microsoft Access 查詢?

Susan Sarandon
Susan Sarandon原創
2025-01-23 08:21:09563瀏覽

How to Securely Use Parameters in VBA for Microsoft Access Queries?

在 Microsoft Access 中不同上下文使用 VBA 參數

許多 Microsoft Access 開發人員由於缺乏對如何正確使用參數的理解,而依賴易受攻擊的程式碼。本簡短指南將力求闡明此主題。

窗體與報表

Access 提供了一種獨特的方式,可以直接在 SQL 程式碼中引用窗體和報表中的值,在大多數情況下無需參數:

<code>DoCmd.RunSQL "INSERT INTO Table1(Field1) SELECT " & _
    "Forms!MyForm!MyTextbox" '插入单个值</code>

TempVars

TempVars 提供了一種儲存和重複使用多個查詢的值的方法:

<code>TempVars!MyTempVar = Me.MyTextbox.Value
DoCmd.RunSQL "INSERT INTO Table1(Field1) SELECT " & _
    "Field1 FROM Table2 WHERE ID = TempVars!MyTempVar"</code>

自訂函數 (UDF)

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.SetParameter 允許為 DoCmd.OpenForm、DoCmd.OpenReport 和一些其他 DoCmd 語句設定參數:

<code>DoCmd.SetParameter "MyParameter", Me.MyTextbox
DoCmd.OpenForm "MyForm",,, "ID = MyParameter"</code>

DAO

在 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

在 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn