Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > Access数据库-查询/SQL语句

全面掌握MS ACCESS SQL(45)

时 间:2018-01-26 11:29:14
作 者:Big Young   ID:252  城市:襄阳
摘 要:    用PARAMETERS声明参数查询实例详解。
正 文:

第二节 用PARAMETERS声明参数查询实例详解

参数查询是指在设计与数据库链接并访问时,在需要数值或数据的地方,使用参数来给值。下面我们分别针对不同的SQL操作,在ACCESS中用PARAMETERS来实现创建不同类型的参数查询,我们还是以系统自带的罗斯文示例数据库为例来说明问题。

一、建立参数化的选择查询

ACCESS SQLSelect(选择)查询中,表名和字段名是不能用参数代替的,参数只能在Where条件子句或GROUP BY…HAVING子句中指定条件的值。例如在罗斯文示例数据库中,我们将以针对员工表创建一个参数化的选择查询,我们想根据不同的姓氏进行查询,SQL语句如下:

PARAMETERS LastName TEXT(50);

Select * FROM 员工 Where 姓氏=[LastName];

这里“LastName”就是一个参数,也就是程序设计中所说的变量,查询在运行时会弹出一个对话框,要求用户指定其值,这是的类型是文本,代表姓氏。这个语句也可以这样写:

Select * FROM 员工 Where 姓氏 = ?;

就是省略了PARAMETERS子句,直接用“?”(英语的问号)代替。

对于这样写的参数查询,大家可能会有一些疑问,如果有多个参数怎么办呢?如:

Select *

FROM 员工

Where 姓氏 = ? AND 名字 = ?;

一个查询中的参数都是问号,这样如何识别那个参数是对应哪个啊?

其实“?”是参数占位符,并不是真正的参数本身,多个参数出现是有的次序的,其对应顺序应是从左往右一一对应。在VBA编程中,如果要引用参数查询,这是的“?”从其到右一一对应到Parameters集合里的元素,只要按顺序引用就可以了。

二、创建参数化交叉表查询

参数化交叉表查询与前面的选择查询相似,或者说就是参数化选择查询的进一步应用,例如:

PARAMETERS prmYear Short;

TRANSFORM Count(订单.[订单 ID]) AS 订单合计

Select 姓氏 & 名字 AS 姓名

FROM 员工 INNER JOIN 订单 ON 员工.ID = 订单.[员工 ID]

Where (((DatePart("yyyy",[订单日期]))=[prmYear]))

GROUP BY 姓氏 & 名字

ORDER BY 姓氏 & 名字

PIVOT DatePart("q",订单日期);

三、创建参数化追加查询

ACCESS SQL的参数化追加查询中,参数只能应用于VALUES子句中指定将要插入的具体值。例如我们要向客户表中插入一条新的记录,SQL语句如下:

PARAMETERS FirstName TEXT(50), LastName TEXT(50);

Insert INTO 客户 (名字, 姓氏)

VALUES (FirstName, LastName);

当然,语句也可以这样写:

Insert INTO 客户 (名字, 姓氏)

VALUES (?, ?);

四、创建参数化更新查询

我们还是以上面的例子来说明,例如我们不是插入客户数据而是要修改某一个客户的数据,参数查询应该是这样的了:

PARAMETERS FirstName TEXT(50), LastName TEXT(50), CustomerID SHORT;

Update 客户

SET 名字 = FirstName, 姓氏 = LastName

Where ID = CustomerID;

此语句也可以省略掉PARAMETERS子句,写成这样:

Update 客户

SET 名字 = ?, 姓氏 = ?

Where ID = ?;

从示例中我们可以看出,在参数化的更新查询中,参数除了与前面的一样可以应用在对记录筛选的WhereHAVING子名中用于指定条件数据,同时也可以应用于给要更新的列赋值。

五、创建参数化的删除查询

对于参数化的删除查询,参数也只是应用于Where条件子句中,用于进行记录的筛选,例如:

PARAMETERS FirstName TEXT(50), LastName TEXT(50);

Delete *

FROM 客户

Where 名字 = FirstName AND 姓氏 = LastName;

或者:

Delete *

FROM 客户

Where 名字 = ? AND 姓氏 = ?;

在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成 SQL 指令的编译后,才套用参数运行,因此就算参数中含有恶意的指令,由于已经编译完成,就不会被数据库所运行。有部份的开发人员可能会认为使用参数化查询,会让程序更不好维护,或者在实现部份功能上会非常不便,然而,使用参数化查询造成的额外开发成本,通常都远低于因为SQL注入攻击漏洞被发现而遭受攻击,所造成的重大损失。通过这些实例我们会发现,其实参数查询的创建是比较简单的,创建后应用也较为灵活方便,不仅可以大大提高查询效率,而且也增强了数据库的安全性。



Access软件网QQ交流群 (群号:483923997)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助