ACCESS带参数的查询详解

时间:2022-10-05 04:10:01

摘 要:总结了ACCESS中设计和实用带参数查询的方法。介绍了通过ADO访问ACCESS中的常规方法,并探讨了ACC-ESS中查询与存储过程的关系,以及以存储过程方式访问查询的方法。

关键词: ACCESS 参数查询 存储过程

1 ACCESS环境下的参数查询

1.1在查询设计器中建立参数查询

参数在查询中,通常作为查询条件准则的一个部分,比如,要根据产品的类别来列出产品清单(例一),则在查询的设计视图中,将字段列表中的[类别ID]字段拖到查询设计网格。然后在其下的“条件”单元格中,键入[a_类别],即建立了名为“a-类别”的参数,保存命名为[按类别查询产品]。

特别注意的是,必须在用[]界定参数名,ACCESS的查询中,用[]来界定对象名,主要是表、查询、字段、参数等,如果在[]中的标识符不是表、查询、字段或其他对象的名称,则ACCESS将它视作参数。

当我们运行查询的时候,系统弹出参数输入对话框,在输入框中输入实际参数值后,Access继续处理查询,然后在数据表中显示查询结果。

1.2参数对话框的使用

参数对话框有两个主要的作用,一是指定参数的数据类型;二是指定运行时参数的输入顺序。

必须要指定参数的数据类型的两种情况是:(1)参数用于交叉表查询;(2)参数的数据类型为逻辑值(是/否)。在交叉表查询中,如果未在参数对话框中指定参数的数据类型,查询运行时将会报错而不能进行,这是由于iet引擎要求TRANSFORM查询中的变量必须有确定的数据类型。

查询参数中有逻辑值(是/否)时,如果不在查询窗口中规定参数为逻辑型(是/否),则系统会把表示逻辑值的数值当成普通的数值,换而言之,只有输入-1/0时才能够和表中的值相匹配。如果在查询窗口中规定参数为逻辑型,那么输入非(4)、yes/no、true/false均能够和表中的值准确匹配。所以在这种情况下,也应在查询参数对话框中作明确的规定,以避免使用时的混乱。

查询窗口的另外一个作用是,当有多个参数时,可以规定参数的输入顺序,在默认情况下,各参数的输入顺序是依其在查询设计网格中出现的位置来决定的,我们可以在查询参数设置对话框中输入相关的参数,强制性的规定各参数的输入顺序。

1.3自定义有提示信息的参数输入窗口

在ACCESS的查询设计器中,参数不仅可以是一个普通的变量,还可以是窗体、报表等容器中所包含的控件。利用这一特性,我们可以把带参数的查询和窗体、报表等结合起来,设计出有自定义提示信息的,或不同输入风格的参数输入窗口。如按类别查询产品时,可以先创建一个命名为“类别查询”的窗体,在该窗体中,创建一个命名为[类别1的组合框,用于输入参数,然后,在查询设计器中建立相应的查询,在[类别id]的条件单元格中输入“[Forms]![类别查询]![类别]”,这样,就可以把自定义窗体和查询联结起来,获得更个性化和高效的输入界面。

2 用ADO访问带参数的查询

2.1利用Parameters集合携带参数

在ADO中,可以用多种方法来查询数据库,如果要使用查询参数时,则必须使用Command对象。

使用Command对象通常用CommandText(属性定义命令)的可执行文本(例如SQL语句)。如果要运行一个查询,将CommandText属性的值设置为该查询的名称即可,然后,在适当时候,用Execute方法执行命令,并返回Recordset对象,但如果要运行一个带有参数的查询,常规的方法是,利用Parameter对象和Parameters集合。

Command对象包含一个由Parameter对象组成的Pa-rameters集合。我们正是通过它们来传递参数的。其使用的过程是,使用CreateParameter方法创建带适当属性设置的Parameter对象,并使用Append方法将它们添加到Pa-rameters集合中,之后再使用Execute方法即可。

在创建Parameter对象时,使用CreateParameter方法,其完整形式为:command,CreateParameter(Name,Type,Direction,Size,Value)

Name为包含Parameter对象的名称,Type指定Pa-rameter对象的数据类型。Direction指定Parameter对象的类型,即该参数是输入参数还是输出参数等,由于AC-CESS只支持输入参数,因此该参数一般是adParamlnput。Size指定参数值的最大长度(以字符或字节为单位)。Value指定Parameter对象的值。这些参数均为可选参数,也可以通过对象的相关属性的设置来达到同样的目的。在将Pa-rameter添加到Parameters集合之前,应规定Parameter的数据类型。访问1.1中例1的[按类别查询产品]的代码如下:

2.2视查询为存储过程

我们可以把查询都当作是对SQL语句的封装和优化,在这点上与存储过程有些接近。可以在ACCESS中把查询视为存储过程。这样,当我们用ADO访问ACCESS中的查询时就可采用另外一种方式,即调用存储过程的方式,调用存储过程也使用Command对象,但在参数的使用上,却采用了不同的方式,即直接通过Execute传递参数。

在ADO中以调用存储过程的方式访问例1中的[按类别查询产品]的代码如下:

其中第二个参数为传递给存储过程的参数,注意,需要把存储过程的参数数组化后才能作为Execute的参数。

比较两段代码,可以得到这样一个结论,如果查询带有参数,既可用Command对象的Parameters的当前值作为参数,也可以在Execute方法中调用传递的参数,对于性能不太敏感的应用而言,这两种方式是没有多大差别的,对于要求较高的性能,则需考虑采用何种方式,因为Command对象有一个CommandType属性,该属性指定系统按何种方式处理Commandtext,比如是按查询表的方式(adCmdTable),还是按存储过程的方式(adCmdStoredProe)。对不同的方式系统可以按其特性进行优化处理。而在以上两段代码中使用Command对象时,均未对Command对象的Command-Type属性作设置,此时取默认值adCmdUnknown表示类型未知,系统性能将会降低,因为ADO必须耗费代价来确定CommandText属性是SQL语句、存储过程还是表名。如果知道正在使用的命令的类型,设置CommandType属性可以提示ADO直接转入相关代码,所以,使用的查询是类似于SOL查询的返回,则应设置CommandType为ad-CmdTable,而其他无返回的的查询则建议使用adCmd-StoredProc,一旦明确了CommandType,那么调用方式就不可混淆,这样可以提高执行效率。问时我们也可以考虑到应用在ACCESS和SQL SERVER之间平滑迁移时的需要,来选择策略。

上一篇:基于分辨矩阵的论域划分方法 下一篇:基于序列图像的三维重构