Sql 如何在Microsoft Access的不同上下文中使用VBA中的参数?
我读了很多关于SQL注入和使用参数的资料,比如。然而,我在Access中使用的是一个复杂的应用程序,它在各种地方都有很多带有字符串连接的动态SQL 它有以下几点我想更改,并添加参数,以避免错误,并允许我使用单引号处理名称,如Jack O'Connel 它使用: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命令DoCmd.RunSQL
- 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
集合设置参数<