计算机工程
COMPUTER ENGINEERING
1999年 第25卷 第10期 Vol.25 No.10 1999



通用数据库操作模块的设计与实现
冯汉平　何踊跃　吴琢琼
摘要：在分析常用SQL数据操作语句结构的基础上，介绍了一个通用数据库操作模块的设计与实现。该模块允许助记词采用填表的直观形式，实现数据库的通用查询、插入、删除和修改，具有功能很大、操作简单等优点。
关键词：数据库；SQL语言；数据操作
The Designing and Implementation o fa General Database Manipulation Module
Feng Hanping He Yongyue Wu Zuoqiong
(Systems Engineering Institute of Xi'an Jiaotong University,Xi'an 710049)
【Abstract】Based on the analysis of the structure of common SQL data manipulation sentences,this paper inrtoduces the designing and implementation of a general database manipulation module.This module offers the users a visualized way of filling up forms which executes the general database functions of query,insertion,deletion and update.It is highly functional and easy to use
【Key words】Dataase;SQL language;Data manipulation
　　在一个较复杂的管理信息系统中，查询和更新数据库都是常用的操作。通常的做法是按照预先设定的方式提供某些数据库操作，如数据录入、查询、统计、报表输出等。其弊端是：1)不能适应用户需求的变化，缺乏灵活性；2)对数据库结构调整的适应能力不强；3)对用户不常用的操作也需要专门编写代码，浪费人力物力。因此有必要开发一个通用的数据库操作模块，以一种简单明了的方式，向用户提供灵活安全的数据库操作能力，以适应用户的各种要求。本文介绍的通用数据库操作模块在Delphi环境下实现,其思想可以很容易地移植到其他基于Windows的开发环境上。
1　基本思路
　　SQL语言是关系数据库的标准语言，兼有数据定义、数据操作和数据控制的功能。它不但语义功能强大，而且可以为Delphi等很多编程软件直接执行，用它来表示用户访问数据库的要求是个很好的选择。但是不能让用户直接使用SQL语言，因为：1)需要输入大量的英文文本，可操作性差，界面不够友好；2)无法保证数据安全。受到域运算语言QBE的启发[1]，本模块采用填表的方式，在全中文图形界面下，由程序把用户的要求解释成SQL语句，从而把面向专业人员的SQL语言以一种简便直观的方式提供给普通的中文用户。在解释过程中进行的权限检查，可以确保数据的安全。
1.1 SQL数据操作语句的分析
　　SQL语言的数据定义和数据控制语句一般不需要也不允许终端用户使用，用户通常只用到查询、插入、删除和更新等4种数据库操作，表现在SQL语句上是4种常用的句型：
　　Select〈字段列表〉from〈表名〉[,〈表名〉…〈[where〈条件〉]
　　Insert into〈表名〉[(〈字段列表〉)]values(〈值列表〉)
　　Delete from〈表名〉[where〈条件〉]
　　Update〈表名〉set〈修正式列表〉[where〈条件〉]
　　进一步的语法分析表明，这些操作可以归结为：对目标〈数据表〉中满足特定〈条件〉的记录中某些〈字段〉，进行某种〈操作〉(查询、插入、删除、修改)。因此，数据表、字段列表、条件表达式、操作类型就构成了SQL语句的4个要素。〈值列表〉和〈修正式列表〉也是针对各字段的插入值或修改值，可以归结到字段列表要素中去。从而，确定SQL语句的过程就转化为确定这4个要素的过程。
　　允许使用复杂的条件是SQL语言最强大的功能之一，条件表达式是一个逻辑表达式，可以归结为：
　　〈条件〉:=〈子条件〉or|and〈子条件〉[or|and〈子条件〉…]
　　〈子条件〉:=〈字段〉〈操作符〉〈表达式〉
　　〈操作符〉:=>|<|=|>=|<=|<>
　　在〈子条件〉中，〈操作符〉左边虽不一定是字段，但经过变换，都可以归结为其左边是字段的形式。〈操作符〉右边的〈表达式〉可以引用其它的字段。为了直观地表达〈子条件〉之间的“与”和“或”的关系，使用了一种如表1所示的表格输入方式。当两个〈子条件〉之间是“或”的逻辑关系时，在不同的条件行输入；是“与”的关系且涉及不同的〈字段〉时，在同一个条件行的不同列内输入；若涉及同一〈字段〉，且相互之间是“与”的关系，可在表中同一格内输入，并用逗号隔开。在生成条件表达式时，先执行同一条件行内的“与”关系，再执行条件行间的“或”关系，这样可以表达任意复杂的条件。在表中输入〈子条件〉，只需在条件行相应于〈字段〉的列填写〈操作符〉和〈表达式〉即可，参看图2。
表1　表格输入方式
数据表名字段 1字段 2字段 3
字段列表　　　
条件　　　
条件　　　

图2 主界面
　　在具体实现时，确定操作类型和数据表名的过程是独立进行的，模块分别把前述4种操作类型和系统可操作的表名以按钮和列表的形式，提供给用户选择。确定字段列表和条件表达式的过程同时进行：用户根据实际需要将数据库操作的要求填入如表1所示的表格中，模块根据表格中字段列表行的内容，可以确定各项操作的目标字段；根据表中条件行的内容，可以确定条件表达式。确定这4个要素后，系统只需要按照SQL的句法规律就可以合成正确的SQL指令了。
1.2 多表的连接
　　若用户选择了多个数据表，程序将自动搜索这些数据表之间共有的字段，生成连接条件。默认的连接条件具有Table1.C1=Table2.C1[and…]的形式，其中Table1和Table2是要进行连接的数据表名，C1是公共字段。用户也可以自己输入连接条件。若用户在进行多表连接时仍想实现更新，模块可在这些表上建立一个视图，这时用户就可以像在单表上操作一样插入、删除和修改了，不过这需要在支持视图的后台数据库上才能实现。
1.3 中文的处理
　　由于大部分桌面和后台数据库系统都使用英文作字段名，为了引入中文描述，模块中使用了如下类记录字段的信息：
　　TFieldInf=class
　　　Name:string;　　　//字段名
　　　Description:string;　//字段的中文描述
　　　AllowUpdate:boolean;　//标识是否允许修改
　　end;
　　模块中有专门的程序把字符串中表名或字段的中文描述转换成对应的英文。这样，用户可以直接在中文环境下进行各种操作，程序的其它部分也可以直接使用中文描述，只需在最后调用一下转换程序。对于常用的中文描述，模块提供了快捷菜单，以方便用户的输入。下文在不引起歧义的情况下，对表名(字段名)及其中文描述不作严格区分。
1.4 数据的安全性
　　模块设置了标志是否允许更新的权限参数，并在解释过程中进行权限检查，对数据的控制可以精确到字段，确保数据的安全。
2　系统的实现
　　本模块实现了查询、插入、删除、修改等 4 种通用的数据库操作，其各个功能模块之间的调用关系如图1。

图1 系统调用关系
2.1 主控模块
　　主控模块是主要的人机接口，其功能是接受用户的输入，并传递给相应的功能模块，同时将系统信息返回给用户。主控模块首先要求用户选择要处理的数据表，然后从其中取出各个字段名，并在窗口中以表1所示的形式显示出来，接受用户的输入。
2.2 条件生成模块
　　条件生成模块根据用户在条件行中填入的信息生成条件表达式。如图2中所示的为查询所有欠费的住户信息。程序生成的条件表达式为“电费应收金额>电费实收金额or 水费应收金额<水费实收金额”(对于多表连接查询，生成的条件表达式中各字段前将带上所在的表名，并与数据表的连接条件作“与”运算。)
2.3 查询模块
　　查询模块除了可进行复杂的条件查询外，还能实现一些统计功能。例如，用户想求总电费应收金额，只需在第二行中“电费应收金额”下输入“sum”或“总和”，并清除其它字段的查询状态即可。模块支持的统计函数如表2所示。查询的结果在窗口的底部显示。若权限允许，用户可直接在查询结果上修改数据。
表2 常用统计函数及其中文描述
统计函数中文描述
Count数目
Sum总和
Avg平均值
Max最大值
Min最小值
2.4 其它功能模块
　　系统中的插入、删除、修改等模块，主要完成对指定的数据表进行插入、条件删除或条件修改等功能，其操作过程与查询子模块相似。在这些子模块中，需要生成〈字段列表〉、〈值列表〉、〈修正式列表〉等关键部件，它们的生成方式类似于条件表达式。以〈修正式列表〉为例，假设用户需要修改“电费应收金额”的值，可在此字段下面填写修改的目标值，如表3所示。用户可以同时修改多个字段。这些模块可以帮助用户完成很多不常用的操作，例如“把月用电量超过100度的住户的电费打9折以鼓励用电”等操作。 
表3 修改操作的目标值
目标值示例生成的〈修正式列表〉
+1电费应收金额=电费应收金额+1
=1电费应收金额=1
电费实收金额电费应收金额=电费实收金额
($+1)*2电费应收金额=(电费应收金额+1)*2
3　面向Delphi的另一种实现
　　在Delphi中，TTable和TQuery是常用的两种数据库处理控件，它们都是TBDEDataSet的子类。本模块也可以用TBDEDataSet的对象作为调用接口。这样实现主要有3个优点：1)可以使用Delphi数据库处理控件强大的计算字段和LookUp字段功能；2)表中字段名及其中文描述，以及是否允许修改的标志都可以直接从TBDEDataSet对象的属性中得到；3)多表的操作可以用Query实现，不需另外处理。不过，这样实现就不能使用SQL语句表示处理要求了，而需用TBDEDataSet的Filter等属性(生成方式类似于SQL语句)以及插入删除等方法，效率比用SQL语句低一些。 
4　结束语
　　本文介绍的通用数据库操作模块，实现了在各种表上进行复杂的查询、插入、删除和更新，并提供了安全限制和一定的模糊处理能力，用户只需填表便可以完成各种操作，非常容易掌握。作为西安市某物业管理公司收费信息管理系统的一个功能模块，已经交付用户使用，在基于以太网的InterBase数据库系统中运行良好，深得用户好评。
作者简介：冯汉平（1979～），男，硕士，主攻方向：电力调度与电力市场化
作者单位：西安交通大学系统工程研究所，西安710049
参考文献
1 陈学,陈洪亮.数据库原理与工程应用.合肥：中国科学技术大学出版社,1996
2 萨师煊,王珊.数据库系统概论.北京：高等教育出版社,1994
3 薛华成.管理信息系统.北京：清华大学出版社,1993
收稿日期：1999-03-15
