Sql 如何在Microsoft Access的不同上下文中使用VBA中的参数?

Sql 如何在Microsoft Access的不同上下文中使用VBA中的参数?,sql,vba,ms-access,Sql,Vba,Ms Access,我读了很多关于SQL注入和使用参数的资料,比如。然而,我在Access中使用的是一个复杂的应用程序,它在各种地方都有很多带有字符串连接的动态SQL 它有以下几点我想更改,并添加参数,以避免错误,并允许我使用单引号处理名称,如Jack O'Connel 它使用: DoCmd.RunSQL执行SQL命令 DAO记录集 ADODB记录集 表单和报表,使用DoCmd.OpenForm和DoCmd.OpenReport打开,在WhereCondition参数中使用字符串连接 使用字符串连接的域聚合,如D

我读了很多关于SQL注入和使用参数的资料,比如。然而,我在Access中使用的是一个复杂的应用程序,它在各种地方都有很多带有字符串连接的动态SQL

它有以下几点我想更改,并添加参数,以避免错误,并允许我使用单引号处理名称,如Jack O'Connel

它使用:

  • DoCmd.RunSQL
    执行SQL命令
  • DAO记录集
  • ADODB记录集
  • 表单和报表,使用
    DoCmd.OpenForm
    DoCmd.OpenReport
    打开,在
    WhereCondition
    参数中使用字符串连接
  • 使用字符串连接的域聚合,如
    DLookUp
查询的结构主要如下所示:

DoCmd.RunSQL "INSERT INTO Table1(Field1) SELECT Field1 FROM Table2 WHERE ID = " & Me.SomeTextbox
对于这些不同类型的查询,我可以选择哪些参数

这个问题旨在作为一个资源,了解我如何在各种帖子上频繁使用参数评论

在查询中使用参数的方法有很多。我将尝试为其中大多数提供示例,以及它们适用的地方

首先,我们将讨论Access特有的解决方案,例如表单、报表和域聚合。然后,我们将讨论DAO和ADO


使用表单和报表中的值作为参数 在Access中,您可以在SQL代码中直接使用窗体和报表控件的当前值。这限制了对参数的需要

您可以通过以下方式引用控件:

表单!我的表格!MyTextbox
用于表单上的简单控件

表单!我的表格!我的子窗体,窗体!子窗体上控件的MyTextbox

报告!我的报告!MyTextbox
用于报表上的控件

示例实现:

DoCmd.RunSQL“插入到表1(字段1)选择表单!MyForm!MyTextbox”插入单个值
DoCmd.RunSQL“插入到表1(字段1)从表2中选择字段1,其中ID=Forms!MyForm!MyTextbox””从其他表插入
可用于以下用途:

使用
DoCmd.RunSQL
时,常规查询(在GUI中)、表单和报表记录源、表单和报表过滤器、域聚合、
DoCmd.OpenForm
DoCmd.OpenReport

这不适用于以下用途:

使用DAO或ADODB执行查询时(例如打开记录集,
CurrentDb.Execute


使用临时变量作为参数 Access中的临时变量是全局可用的变量,可以在VBA中或使用宏进行设置。它们可以用于多个查询

示例实现:

TempVars!MyTempVar=Me.MyTextbox.Value'注意:。值是必需的
DoCmd.RunSQL“插入表1(字段1)从表2中选择字段1,其中ID=TempVars!MyTempVar”
删除“MyTempVar”,使用完毕后取消设置TempVar
TempVars的可用性与表单和报表中的值的可用性相同:不适用于ADO和DAO,可用于其他用途

我建议临时变量在打开窗体或报表时使用参数,而不是引用控件名称,因为如果打开它的对象关闭,临时变量将保持可用。我建议对每个表单或报表使用唯一的TempVar名称,以避免刷新表单或报表时出现奇怪的情况


使用自定义函数(UDF)作为参数 与TempVars非常相似,您可以使用自定义函数和静态变量来存储和检索值

示例实现:

选项比较数据库
选项显式
Private ThisDate作为日期
公共函数GetThisDate()作为日期
如果ThisDate=#12:00:00 AM#那么
'设置默认值。
ThisDate=日期
如果结束
GetThisDate=ThisDate
端函数
公共函数将ThisDate(ByVal NewDate As Date)设置为日期
ThisDate=NewDate
SetThisDate=ThisDate
端函数
然后:

SetThisDate SomeDateValue'将在ThisDate中存储SomeDateValue。
DoCmd.RunSQL“插入到表1(字段1)中,从表2中选择字段1,其中[SomeDateField]=GetThisDate()
此外,可以创建一个带有可选参数的函数,用于设置和获取私有静态变量的值:

公共函数ThisValue(可选ByVal值作为变量)作为变量
静态电流值作为变量
'定义默认返回值。
Const DefaultValue作为Variant=Null
如果不是IsMissing(值),则
'设置值。
当前值=当前值
如果为空(当前值),则
'设置默认值
CurrentValue=DefaultValue
如果结束
'返回值。
此值=当前值
端函数
要设置值,请执行以下操作:

ThisValue“一些文本值”
要获取值,请执行以下操作:

CurrentValue=此值
在查询中:

ThisValue“SomeText”设置要过滤的值。
DoCmd.RunSQL“插入到表1(字段1)中,从表2中选择字段1,其中[SomeField]=ThisValue()

使用DoCmd.SetParameter
DoCmd.SetParameter
的使用非常有限,因此我将简要介绍。它允许您设置在
DoCmd.OpenForm
DoCmd.OpenReport
和其他一些
DoCmd
语句中使用的参数,但它不适用于
DoCmd.RunSQL
、过滤器、DAO和ADO

示例实现

DoCmd.SetParameter“MyParameter”,Me.MyTextbox
DoCmd.OpenForm“MyForm”,,“ID=MyParameter”

用刀 在DAO中,我们可以使用
DAO.QueryDef
对象创建查询,设置参数,然后打开记录集或执行查询。首先设置查询的SQL,然后使用
QueryDef.Parameters
集合设置参数<