本章要点:
Query组件的属性
Query组件的方法
SQL语言基础
Query组件利用 SQL语言的增,删,改,查操作
综合实例:学生信息管理程序第 12章 SQL数据库程序设计
12.1 Query组件的属性和方法
SQL语言,又称为结构化查询语言,它在数据库程序设计中是十分重要的。任何一门支持数据库程序设计的语言必定提供对 SQL语言的支持,Delphi 7.0也不例外。在 Delphi
7.0中提供了很多支持 SQL语言操作的组件,Query组件就是其中之一。 Query组件是 BDE数据集组件之一,在 Delphi 7.0
组件选择板上 BDE选项卡上,与 Table组件具有很多共同的特性。第 11章已经对 Table 组件的使用较详细地进行了介绍。
Query 组件在 SQL 编程中占据十分重要的地位,实现了
Delphi 7.0对 SQL语言的支持。在 Delphi 7.0开发的数据库应用中,SQL语句是通过 Query部件传递到要访问的数据库系统的数据库引擎中,由数据库引擎具体执行 SQL语句,以实现对数据的操作。而不是传递给 Delphi 7.0中的 BDE,由
BDE实施具体的 SQL动作。本章内容重点讲解如何用 Query
组件来进行 SQL语言的操作。
12.1.1 Query组件的常用属性 (1)
1,DataBaseName属性跟 Table组件一样,Query组件也是通过 DataBaseName属性来链接数据库的。可以是某个数据库别名也可以是某个数据表的路径。详细方法可以参照 Table组件的用法。
2,SQL属性
Query组件是通过 SQL属性对数据集进行操作,而不是通过指定一个
TableName属性的值直接指向一个表。 SQL是一个字符串对象,可以给该属性设置 SQL语句,从而让 Query组件使用 SQL语句操纵数据库。例如,在
SQL属性中输入了合法的 Select查询语句,然后可以将 Query组件的 Active
属性设置为 True或者调用 Open方法就可以打开数据集。 SQL属性还提供了设置 SQL语句的各种方法,如 Add,Clear等方法分别用来添加和清除 SQL语句,在程序中运用十分广泛。
3,Filter属性该属性是用来过滤记录的,就是按照某个字段的具体值进行过滤记录。
它有点类似于查询,也称为筛选记录。具体格式如下:
Query1.Filter,= '字段名 =字段值 '
或者可以直接在对象浏览器中找到 Filter属性,并输入“性别 = '男 ',,注意不
12.1.1 Query组件的常用属性 (2)
带双引号,但过滤字段值“男”字必须用单引号括起来。但在代码中,
要用两个连续的单引号表示一个单引号。
另外,要让 Filter属性设置的过滤条件有效,则必须设置另外一个属性
Filtered。只有当 Filtered属性值为 True时,Filter属性设置才有效。
其实,在 Table组件中也包含了 Filter和 Filtered属性。所以,Table组件和
Query组件的很多属性都是相同的,而且用法也一样,如 Active,Fields
等,可以参考 Table组件中的相关用法。
12.1.2 Query组件的常用方法
1,Open方法用于打开或激活 Query数据集。一般只执行 Select查询语句。
2,ExecSQL方法执行 Query组件中的 SQL语句,不仅可以执行 Select查询语句,
而且可以执行其他的 SQL命令,如 Insert,Update,Delete等 SQL
命令。关于 Open方法和 ExecSQL方法的区别本书将在后面的章节里进一步地加以讨论。
3,Close方法关闭数据集。
12.1.1 Query组件的常用属性 (3)
4,SQL属性的两个基本方法
( 1) Add方法给 Query组件的 SQL属性添加 SQL命令语句,以供 Query组件执行。 Add
是 SQL属性中的一个方法。如下列语句:
Query1.SQL.Add(?select * from student?);
Query1.SQL.Add(? order by 学号’ );//在前一句 SQL语句的基础上追加
SQL语句这里也可以把以上两句语句合成一句,如下所示。这两种方法是等效的。
Query1.SQL.Add(?select * from student order by 学号’ );
(2) Clear方法
Clear方法是清除 Query组件的 SQL属性值。它也是 SQL属性中的一个方法。一般在用 Add方法添加 SQL语句前,先要用 Clear方法将 SQL属性清空,然后再添加全新的 SQL语句。
12.1.1 Query组件的常用属性 (4)
【 例 12-1】 使用 Query组件显示 student.db中全部记录内容。设计窗体如图 12-1所示,程序运行效果如图 12-2所示。
图 12-1 窗体设计界面 图 12-2 程序运行界面这个例子要求用 Query组件结合 SQL语句显示 student.db中全部记录内容,并显示在 DBGrid组件中。具体实现步骤如下。
在应用窗体中放置一个 Query部件( Query1)、一个 TDataSource部件
( DataSource1)和一个 TDataGrid部件( DBGrid1),并将它们链接起来;
链接方法:将 DataSource1组件的 DataSet属性设置为 Query1;将 DBGrid1组件的 DataSource属性设置为 DataSource1。
设置窗体 Query 部件 Query1的 DatabaseName属性值为数据库别名
stu_data
双击对象查看器 Object Inspector窗口中 Query1的 SQL 属性,Delphi 7.0将显示 String List Editor对话框。
12.1.1 Query组件的常用属性 (5)
【 例 12-1】 使用 Query组件显示 student.db中全部记录内容。设计窗体如图 12-1所示,程序运行效果如图 12-2所示。
图 12-1 窗体设计界面 图 12-2 程序运行界面这个例子要求用 Query组件结合 SQL语句显示 student.db中全部记录内容,
并显示在 DBGrid组件中。具体实现步骤如下。
在应用窗体中放置一个 Query部件( Query1)、一个 TDataSource部件
( DataSource1)和一个 TDataGrid部件( DBGrid1),并将它们链接起来;
链接方法:将 DataSource1组件的 DataSet属性设置为 Query1;将 DBGrid1组件的 DataSource属性设置为 DataSource1。
设置窗体 Query 部件 Query1的 DatabaseName属性值为数据库别名
stu_data
双击对象查看器 Object Inspector窗口中 Query1的 SQL 属性,Delphi 7.0将显示 String List Editor对话框。
12.1.1 Query组件的常用属性 (6)
在图 12-3中的 String List Editor对话框中输入 SQL语句:
Select * from student order by 学号
单击 OK按钮,关闭 String List Editor对话框。
设置 Query的 Open属性为 True。
图 12-3 String List
Editor对话框这样,就可以将 student.db数据表中全部记录内容显示在 DataGrid1组件中。这是一种用 SQL语句查询数据集中记录内容的方法,另外在 Delphi
7.0中用得最多的还是在程序代码中用相应的方法来实现 SQL语句的查询。
利用代码执行 SQL语句,在一般的数据库程序设计中用得很广泛,而且很灵活。但值得注意的是在添加 SQL属性前首先要用 Close方法关闭数据集;
在应用程序中为 SQL属性设置新的 SQL 命令语句时,必须要调用 Clear方法以清除 SQL属性中现存的 SQL命令语句,如果不调用 Clear方法,可调用 Add
方法向 SQL属性中设置 SQL命令语句,那么新设置的 SQL命令语句会追加在现存 SQL命令语句后面,但在程序运行时常常会出现出乎意料的查询结果,
甚至程序无法运行下去。
12.2 动态 SQL语句的编程 (1)
Query组件提供了强大的 SQL语言支持功能,这大大提高了数据库应用程序的执行效率 。 Query组件不仅可以执行静态的 SQL语句,而且可以执行动态的 SQL语句 。 静态 SQL语句在程序设计时便已固定下来,它不包含任何参数和变量 。 而动态 SQL语句,被称为参数化的语句,其中包含着表示字段名或表名的参数 。 在实际程序设计中使用得更多的是动态 SQL语句 。 在这一节将重点介绍如何给动态 SQL语句的参数赋值,以及在应用程序中灵活地使用 SQL语句 。
通常采用以下三种途径来为它赋值,这三种途径都是在程序代码中实现的 。
1,采用字符串连接符号,+”连接组成完整的 SQL语句这里用到字符串连接符号,+”进行字符串的连接操作。具体表示方法如下:
XM='赵凯 '
Query1.SQL.Add('select * from student where 姓名 = '' ' + XM + ' '' ');
注意,在 Delphi 7.0语言的字符串中,连续两个单引号表示一个单引号。
上述 SQL语句中由两个字符串连接符号,+”,三个字符串连接而成,组成了一句完整的查询语句。读者要读懂字符串连接的含义。
12.2 动态 SQL语句的编程 (2)
Query组件提供了强大的 SQL语言支持功能,这大大提高了数据库应用程序的执行效率 。 Query组件不仅可以执行静态的 SQL语句,而且可以执行动态的 SQL语句 。 静态 SQL语句在程序设计时便已固定下来,它不包含任何参数和变量 。 而动态 SQL语句,被称为参数化的语句,其中包含着表示字段名或表名的参数 。 在实际程序设计中使用得更多的是动态 SQL语句 。 在这一节将重点介绍如何给动态 SQL语句的参数赋值,以及在应用程序中灵活地使用 SQL语句 。
通常采用以下三种途径来为它赋值,这三种途径都是在程序代码中实现的 。
1,采用字符串连接符号,+”连接组成完整的 SQL语句这里用到字符串连接符号,+”进行字符串的连接操作。具体表示方法如下:
XM='赵凯 '
Query1.SQL.Add('select * from student where 姓名 = '' ' + XM + ' '' ');
注意,在 Delphi 7.0语言的字符串中,连续两个单引号表示一个单引号。
上述 SQL语句中由两个字符串连接符号,+”,三个字符串连接而成,组成了一句完整的查询语句。读者要读懂字符串连接的含义。
12.2 动态 SQL语句的编程 (3)
2,使用 Params属性为参数赋值
Query组件具有一个 Params属性,它们在设计时不可用,在程序运行过程中可用,并且是动态建立的,当为 Query组件编写动态 SQL语句时,
Delphi 7.0会自动地建立一个数组 Params,数组 Params是以 0下标开始的,
依次对应动态 SQL 语句中的参数,也就是说动态 SQL语句中第一个参数对应 Params [0],第二个参数对应 Params [1],依此类推。
3,使用 ParamByName方法为参数赋值
ParamByName是一个函数,用动态 SQL语句中的参数作为调用
ParamByName函数的参数,这样便可以为它们赋值。使用这种赋值方法,
必须要知道动态 SQL语句参数的名字。
使用这种方法同样可以为各参数赋值,但在 ParamByName方法中必须指明参数名。这样给参数赋值,更加直观一些。注意不要把 Params属性和 ParamByName方法的用法混淆,Params属性中指明的是参数出现的先后次序,从 0开始排序,Params[0]表示第一个参数,Params[1]表示第二个参数,依次类推。而 ParamByName方法要指定参数的名称,所以更加直观、易理解。
12.3 常用 SQL语句简介
SQL是结构化查询语言 。 SQL的大部分实现都与该语言的某个特定定义相关 。 例如,许多数据库的 SQL服务器支持 ANSI-92 SQL定义 。 所使用的
SQL语言的语法依赖于所用的特定数据库 。 结构化查询语言 SQL是定义和维护关系数据库的专用语言,已经被众多的数据库管理系统所采用,如 MS
SQL SERVER,ORACLE,SYBASE,Informix等数据库管理系统 。 事实上,
关于 SQL语言有一个专门的 ANSI标准,而很多数据库管理系统又有自己对标准 SQL语言的扩充 。 Delphi 7.0与使用 SQL语言的数据库管理系统兼容,
在使用 Delphi 7.0开发数据库应用程序时,可以使用 SQL语言编程,开发出功能强大的客户 /服务器程序 。
12.3.1 SQL的优点
SQL的用户包括应用程序员,DBA管理员和终端用户。 SQL语言的优点很多,简述如下。
( 1)非过程化语言
SQL是一个非过程化的语言,因为它一次处理一个记录,对数据提供自动导航。 SQL允许用户在高层的数据结构上工作,可操作记录集,而不对单个记录进行操作。所有 SQL 语句接受集合作为输入,返回集合作为输出。 SQL的集合特性允许一条 SQL语句的结果作为另一条 SQL语句的输入。
( 2)统一的语言
SQL可用于所有用户的 DB活动模型,包括系统管理员、数据库管理员、
应用程序员、决策支持系统人员及许多其他类型的终端用户。基本的 SQL 命令只需很少时间就能学会,最高级的命令在几天内便可掌握。
( 3) SQL是所有关系数据库的公共语言由于所有主要的关系数据库管理系统都支持 SQL语言,用户可将使用 SQL
的技能从一个 DBMS转到另一个。所有用 SQL编写的程序都是可以移植的,从而大大加强了数据库程序开发的灵活性。程序开发人员可以用多种语言编写数据库应用程序,但对数据库维护的 SQL语句的使用是一致的。
12.3.2 SQL语言的基本操作 (1)
SQL语言的作用很广,它最大、最突出的功能就是查询,也是它用得最广的功能。除了查询以外还可以实现记录的插入、修改和删除以及数据表的建立、修改、删除等操作。
1,Select语句
Select语句用于以行为单位从一个或多个表获取数据。现在,把注意力集中到单表的 Select语句上。 Select语句的关键字如表 12-2所示。基本的 Select语句的规范形式如下:
Select字段列表 From表名 Where查询条件 Group by分组字段
Having 分组条件 Ooder by字段名 [ASC|DESC]
一般在程序中应用 SQL语句前,经常要先调试 SQL语句是否书写正确。在 Delphi 7.0中为了调试 SQL语句,提供了数据库浏览器工具 ——SQL
Explorer。数据库浏览器 ——SQL Explorer可以通过 Delphi 7.0主菜单中的 【 Database】 菜单下的
【 Explorer】 菜单项进入,如图 12-5所示。
图 12-5 SQL
Explorer操作窗体
12.3.2 SQL语言的基本操作 (2)
在 SQL Explorer操作窗口的左窗口中选择数据库别名,如 stu_data,可以查看该别名下的数据表中详细内容,包括数据表的定义信息,记录内容和字段等详细信息 。 要调试 SQL语句,可以在右边窗口中选择 Enter SQL选项,
并在文本框中输入 SQL语句 。 例如在上图中输入 select * from STUDENT,
然后单击右边的执行 SQL按钮,如果 SQL语句书写正确就会在下面网格中显示具体的查询结果 。
【 例 12-4】 组合查询记录所谓组合查询就是在查询时查询条件有多个。在 where子句后面各个条件之间用逻辑运算符 and或者 or进行连接,例如要查询姓“李”的“男”学生的记录,则 SQL查询语句应该这样写:
Select * from student where 姓名 like '李 %' and 性别 ='男 '
此例在 【 例 12-2】 的基础上,增加用姓名和性别两个字段的组合查询,
并要求对姓名可以实现模糊匹配查询。在原来的基础上添加 1个标签框
Label2和 1个组合框 ComboBox1,在组合框 ComboBox1中添加“所有”、
“男”、“女” 3个选项,并修改 Button1的 Click事件代码如下:
12.3.2 SQL语言的基本操作 (3)
procedure TForm1.Button1Click(Sender,TObject);
Var StrSql:String; //存放 SQL语句的变量
begin
StrSql:='select * from student Where 1=1 ';
{这个语句是给 StrSql变量赋初值,,1=1”这个条件始终为真,并没有多大意义,
只是为了下面的 SQL语句的连接时方便一些。 }
If Trim(Edit1.Text)<>'' Then
StrSql:=StrSql+' And 姓名 Like ''%'+Trim(Edit1.Text)+ '%''';
//注意字符串的连接方法,两个连续的单引号表示一个单引号
If Trim(Combobox1.Text)<>'所有 ' Then
StrSql:=StrSql+' And 性别 = '''+Trim(Combobox1.Text)+'''';
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add(StrSql);//将 StrSql变量值加到 Query1组件的 Sql属性中
Query1.Prepare;
Query1.Open;
if Query1.Eof then
begin
12.3.2 SQL语言的基本操作 (4)
showmessage('没有找到相关记录! ');
Edit1.Clear;
Combobox1.text:='所有 ';
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select * from student');
Query1.Open;
end
end;
【 例 12-5】 用 SQL语句从 Student.db和 Score.db两张数据表中查询记录内容。
跟前面几个例子一样,在窗体上放置 1个 Query组件,1个 DataSource组件、
1个 DBGrid组件和 1个 DBNavigator组件。如图 12-6所示。将 Datasouce组件的
DataSet属性设置为 Query1,并分别将 DBGrid组件和 DBNavigator组件的
DataSource属性都设置为 DataSource1。
本例要求从 Student.db中选择学生的学号和姓名两个字段的数据,从学生成绩表 Score.db中选择与该学生相关的课程和成绩两个字段的内容,构成一个新的记录集,可在窗体的 OnActivate事件中使用 SQL语句,通过,where student.
学号 =Score.学号”短语将两个表连接起来。 SQL语句表示如下:
图 12-6 多表查询运行界面
12.3.2 SQL语言的基本操作 (6)
具体程序代码如下:
procedure TForm1.FormActivate(Sender,TObject);
begin
Query1.DatabaseName,='stu_data'; //设置 Query组件的别名
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select student.学号,student.姓名,Score.课程,Score.成绩 ');
Query1.SQL.Add(' from student,Score');
Query1.SQL.Add(' where student.学号 =Score.学号 ');
Query1.Open;
end;
当程序运行后,数据显示效果如图 12-5所示,通过 DBNavigator组件可以浏览记录指针,但却不能添加、删除和更新记录内容,请读者自己思考为什么不行?
12.3.2 SQL语言的基本操作 (7)
【 例 12-6】 用 SQL语句从 Student.db统计出男生和女生的人数,如图 12-7
输出 。
图 12-7 输出男女生人数统计表在窗体上放置 1个 Query组件,1个 DataSource组件,1个 DBGrid组件。
将 DataSource组件的 DataSet属性设置为 Query1,并分别将 DBGrid组件的
DataSource属性都设置为 DataSource1。
为了统计男生和女生的人数,需要对 student.db数据表中的记录按性别进行分组。,Group by 性别”可以将性别相同的记录合并成一条记录。要得到统计结果,需要构造一个输出字段,此时可使用 SQL的统计函数 Count()作为输出字段,它按性别分组统计每个分组的记录个数,要显示统计结果,可以用 AS 短语命名一个新的字段别名。本例的 SQL语句书写如下:
Select 性别,Count(*) as 人数 from student Group by 性别
12.3.2 SQL语言的基本操作 (8)
程序代码写在窗体的 OnActivate事件中,具体如下所示:
procedure TForm1.FormActivate(Sender,TObject);
begin
Query1.DatabaseName,='stu_data';
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select 性别,count(*) as 人数 from student Group by 性别
');
Query1.Open;
end;
如果统计每个学生的所有课程的总分,显示学号,姓名和总分三项内容,则 SQL语句又该怎么写呢?这里要查询姓名和成绩,所以必须从两张表中进行链接查询,SQL语句表示如下:
select score.学号,student.姓名,sum(score.成绩 ) AS 总分 from
score,student
Where score.学号 =student.学号 Group by score.学号,student.姓名
12.3.2 SQL语言的基本操作 (9)
2,Delete语句
Delete语句非常简单,它的作用是用来删除数据表中的记录。具体格式如下:
Delete from 表名 where条件该命令将删除数据表中满足条件的所有记录内容。更常见的情况是需要删除数据的特定行。对这种情况,添加 Where子句即可。 Delete语句仅仅删除指定条件的记录,并不是删除数据表;如果没有指定删除条件,则删除数据表中的所有记录。
2,Delete语句
Delete语句非常简单,它的作用是用来删除数据表中的记录。具体格式如下:
Delete from 表名 where条件该命令将删除数据表中满足条件的所有记录内容。更常见的情况是需要删除数据的特定行。对这种情况,添加 Where子句即可。 Delete语句仅仅删除指定条件的记录,并不是删除数据表;如果没有指定删除条件,则删除数据表中的所有记录。
图 12-8 删除指定学号的学生记录
12.3.2 SQL语言的基本操作 (10)
确定删除”按钮的 Click事件代码如下:
procedure TForm1.Button1Click(Sender,TObject);
begin
if MessageDlg('你真的要删除学号为 '+trim(Edit1.Text)+'的学生记录吗?
',mtwarning,mbOKCancel,1) =mrOK then
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('Delete from student where 学号 =:XH');
Query1.ParamByName('XH').AsString:=TRIM(EDIT1.Text);
Query1.ExecSQL; //必须调用 ExecSQL方法执行 Delete语句,没有返回结果
//重新获取 student表中的所有记录
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select * from student');
Query1.Open; //查询语句要用 Open方法执行,返回一个记录集
end;
end;
12.3.2 SQL语言的基本操作 (11)
3,Insert语句
Insert语句更为复杂。它用于向表添加行。 Insert语句可用于向所有的字段添加值,也可以只对某些字段添加值,这依赖于具体使用的 Insert语句。
由于这个原因,Insert语句需要表名、字段列表,以及与每个字段相匹配的值。语句的具体形式如下:
Insert into 数据表名 (字段名 1,字段名 2,…)
Values(字段值 1,字段值 2,…)
说明:
( 1)如果没有指定字段名,系统则会按数据表中字段的先后顺序插入数据;
( 2)字段值的数据类型必须与对应字段的数据类型相吻合;
( 3)数据表名可以是可以更新的视图名称,也可以是经过子查询把别的数据表中的内容插入。
【 例 12-8】 使用 Insert语句插入记录。
在 【 例 12-1】 的基础上添加如图 12-9所示的几个组件,1个 GroupBox组件,7
个标签框( Label1~ Label7),7个编辑框( Edit1~ Edit7)和 2个命令按钮
procedure TForm1.Button1Click(Sender,TObject);
//“插入”按钮 Click事件过程
Var xh,xm,xb,csrq,zzmm,jg,rxcj,string;
begin
Try {开始捕捉错误 }
Query1.Close;
query1.SQL.Clear;
//在 SQL语句中,字符类型和日期型的字段值必须加单引号,数值型字段不需要加单引号
xh,=''''+edit1.Text+''''; //学号,需加引号
xm,=''''+edit2.Text+'''' ; //姓名
xb,=''''+edit3.Text+'''' ; //性别
csrq,=''''+edit4.Text+''''; //出生日期
zzmm,=''''+edit5.Text+'''' ; //政治面貌
jg,=''''+edit6.Text+'''' ; //籍贯
rxcj,=edit7.Text ; //入学成绩,不需要加单引号
12.3.2 SQL语言的基本操作 (12)
( Button1~ Button2)。 7个标签框分别标注 student.db数据表中的 7个字段名,
(图 12-9 使用 insert语句插入记录 )
12.3.2 SQL语言的基本操作 (13)
query1.SQL.Add('Insert into student values('+ xh +','+ xm +','+ xb +','+
csrq +','+ zzmm +','+ jg +','+ rxcj +')');
query1.SQL.Add('Insert into student Values(''030117'',''李香香 2'',''女
'',''4/5/45'',''团员 '',''浙江 '',442)');
query1.ExecSQL;
Except
on EDBEngineError do //如果数据库操作发生错误,则显示提示信息。
begin
application.MessageBox('数据库登录错误;请检查 【 学号是否重复! 】
'+#13+#10+'
或者 【 字段值是否为空! 】 或 【 字段类型是否匹配! 】 ','错误!
',MB_OKCANCEL);
end;
end;
//重新显示全部记录内容
with query1 do
begin
close;
12.3.2 SQL语言的基本操作 (14)
4,Update语句
Update语句用于修改现存的记录。 Update语句如果不使用 where子句,将更新所有的记录。大多数情况下都需要限制更新记录的条件,但所有的更新都从基本的语句开始。 SQL语言中 Update的语法如下:
Update 数据表名 set 字段名 1 = 字段值 1 [,字段名 2 = 字段值 2,字段名 N = 字段值 N] Where 更新条件该语句以关键字 Update开始,后接数据表名。 set子句后接逗号分隔的列表,
包括所要更新的字段及其新值。
【 例 12-9】 使用 Update语句修改记录。
界面跟 【 例 12-8】 基本保持不变,只添加一个 Memo1
组件,用来显示 SQL语句。具体界面如图 12-10所示。
图 12-10 使用 Update
语句修改记录程序要求先单击 DBGrid1组件,选择一条要修改的记录,并将该记录的各字段值分别显示到对应的编辑框中,供用户修改。修改完毕后,单击“确定修改”按钮调用 SQL语句中的 Update命令提交修改,并将
Update语句显示在 Memo1组件中。具体代码如下:
12.3.2 SQL语言的基本操作 (15)
procedure TForm1.Button1Click(Sender,TObject);
Var
xh,xm,xb,csrq,zzmm,jg,rxcj,string;
begin
//在 SQL语句中,字符类型的字段值必须加单引号,数值型字段不需要加单引号
xh,=''''+edit1.Text+''''; //学号
xm,=''''+edit2.Text+'''' ; //姓名
xb,=''''+edit3.Text+'''' ; //性别
csrq,=''''+edit4.Text+''''; //出生日期
zzmm,=''''+edit5.Text+'''' ; //政治面貌
jg,=''''+edit6.Text+'''' ; //籍贯
rxcj,=edit7.Text ; //入学成绩
Try
query1.Close;
query1.SQL.Clear;
query1.SQL.Add('Update student set 姓名 ='+ xm +',性别 ='+ xb +',出生日期
='+ csrq +',政治面貌 ='+ zzmm +',籍贯 ='+ jg +',入学成绩 ='+ rxcj);
query1.SQL.Add(' WHERE 学号 ='+xh);
12.3.2 SQL语言的基本操作 (17)
memo1.Text,=query1.SQL.Text ; //在 Memo1中显示 SQL语句
query1.ExecSQL;
Except
on EDBEngineError do
begin
application.MessageBox('数据库登录错误;请检查,'+#13+#10+'
【 字段值是否为空! 】 或 【 字段类型是否匹配! 】 ','错误! ',MB_OKCANCEL);
end; end;
//重新显示全部记录内容
with query1 do
begin
close;
sql.Clear;
sql.Add('select * from student order by 学号 ');
open;
end; end;
{单击 DBGrid1组件中的一条记录时,在文本框中显示选中记录内容 }
12.3.2 SQL语言的基本操作 (18)
procedure TForm1.DBGrid1CellClick(Column,TColumn);
begin
with query1 do
begin
edit1.Text,= fieldbyname('学号 ').AsString ;
edit2.Text,= fieldbyname('姓名 ').AsString ;
edit3.Text,= fieldbyname('性别 ').AsString ;
edit4.Text:=formatdatetime('mm''/''dd''/''yyyy',strtodate (fieldby
name('出生日期 ').AsString));
//将日期转换成,月 /日 /年”格式,显示在 Edit4中。
edit5.Text,= fieldbyname('政治面貌 ').AsString ;
edit6.Text,= fieldbyname('籍贯 ').AsString ;
edit7.Text,= fieldbyname('入学成绩 ').AsString ;
edit2.SetFocus ;
end; end;
12.3.2 SQL语言的基本操作 (19)
前面通过众多例子详细分析了 SQL语句中的 Select,Insert,Update和
Delete语句在 Query组件中的具体应用。 SQL语言在数据库编程中运用十分广泛,这仅仅是一个开始,对于 SQL语句的高级应用,读者可以参考相关 SQL
语言参考书,这里由于篇幅有限将不再讲述。同时,本节会在后面的例子中或多或少地提到 SQL语言的使用。注意以下两点。
( 1)在前面学习的四个 SQL语句中,SELECT语句在 Query组件调用时,可以用 Open方法来调用,也可以用 ExecSQL方法调用;而后面三种 Insert、
Update和 Ddelete语句只能用 ExecSQL方法调用。 Open方法和 ExecSQL方法的区别在于前者可以返回一个记录集结果,而后者没有返回结果。
( 2)在数据库程序开发当中,运用字符串和字符变量连接构成完整的 SQL语句的做法运用相当普遍,用这种方法实现动态 SQL语句十分灵活,且功能十分强大,读者应好好掌握其用法,这将会给编程带来很大的方便。
12.4 Query组件的综合应用举例 (1)
【 例 12-10】 用 Query 组件设计一个学生信息管理程序,数据表为
student.db,实现学生信息的增加,删除,修改和查询,过滤等基本功能 。
程序运行界面如图 12-11所示 。
本程序的具体功能如下。
1,在如图 12-11所示的主窗体中查询和过滤各种条件的记录。检索可以按照学号和姓名两个字段进行查询,还可以选择是否模糊查询。
2,过滤记录。可以按照政治面貌和性别过滤记录内容。
3,单击添加按钮可以弹出图 12-12所示的“添加学生信息”窗体,在新窗体中添加学生记录。
4,在 DBGrid组件中选中一条记录,再单击编辑按钮或者双击 DBGrid组件,
可以弹出“修改学生信息”窗体,
在弹出窗体中修改当前学生记录。
图 12-11 学生信息管理程序主界面图 12-12添加学生信息窗体图 12-13学生信息修改窗体
12.4 Query组件的综合应用举例 (2)
5,单击删除按钮,删除当前记录。
本程序共 3个窗体,主窗体如图 12-11所示,窗体名称为,FormMain;添加学生信息窗体如图 12-12所示,窗体名称为,AddForm;编辑学生信息窗口如图
12-13所示,窗体名称为,EditForm。
程序中共用到两个 Query组件,名称分别为 Query1和 Query_cTemp,一个数据源组件 DataSource1,将它和 Query1组件连接,其他数据控制组件如
DBGrid组件通过 DataSource1组件和 Query1组件建立通信。两个 Query组件
Query1和 Query_cTemp连接的数据源都是 student.db数据表,别名为 stu_data。
Query1组件只用来显示查询记录内容到 DBGrid组件中和其他组件中,而
Query_cTemp组件主要用来添加和修改新记录。按图所示添加其他组件,并设置相关属性。
其中删除记录、添加记录及查询记录的相关程序代码详见本教程 P242~P245
页。
Query组件的属性
Query组件的方法
SQL语言基础
Query组件利用 SQL语言的增,删,改,查操作
综合实例:学生信息管理程序第 12章 SQL数据库程序设计
12.1 Query组件的属性和方法
SQL语言,又称为结构化查询语言,它在数据库程序设计中是十分重要的。任何一门支持数据库程序设计的语言必定提供对 SQL语言的支持,Delphi 7.0也不例外。在 Delphi
7.0中提供了很多支持 SQL语言操作的组件,Query组件就是其中之一。 Query组件是 BDE数据集组件之一,在 Delphi 7.0
组件选择板上 BDE选项卡上,与 Table组件具有很多共同的特性。第 11章已经对 Table 组件的使用较详细地进行了介绍。
Query 组件在 SQL 编程中占据十分重要的地位,实现了
Delphi 7.0对 SQL语言的支持。在 Delphi 7.0开发的数据库应用中,SQL语句是通过 Query部件传递到要访问的数据库系统的数据库引擎中,由数据库引擎具体执行 SQL语句,以实现对数据的操作。而不是传递给 Delphi 7.0中的 BDE,由
BDE实施具体的 SQL动作。本章内容重点讲解如何用 Query
组件来进行 SQL语言的操作。
12.1.1 Query组件的常用属性 (1)
1,DataBaseName属性跟 Table组件一样,Query组件也是通过 DataBaseName属性来链接数据库的。可以是某个数据库别名也可以是某个数据表的路径。详细方法可以参照 Table组件的用法。
2,SQL属性
Query组件是通过 SQL属性对数据集进行操作,而不是通过指定一个
TableName属性的值直接指向一个表。 SQL是一个字符串对象,可以给该属性设置 SQL语句,从而让 Query组件使用 SQL语句操纵数据库。例如,在
SQL属性中输入了合法的 Select查询语句,然后可以将 Query组件的 Active
属性设置为 True或者调用 Open方法就可以打开数据集。 SQL属性还提供了设置 SQL语句的各种方法,如 Add,Clear等方法分别用来添加和清除 SQL语句,在程序中运用十分广泛。
3,Filter属性该属性是用来过滤记录的,就是按照某个字段的具体值进行过滤记录。
它有点类似于查询,也称为筛选记录。具体格式如下:
Query1.Filter,= '字段名 =字段值 '
或者可以直接在对象浏览器中找到 Filter属性,并输入“性别 = '男 ',,注意不
12.1.1 Query组件的常用属性 (2)
带双引号,但过滤字段值“男”字必须用单引号括起来。但在代码中,
要用两个连续的单引号表示一个单引号。
另外,要让 Filter属性设置的过滤条件有效,则必须设置另外一个属性
Filtered。只有当 Filtered属性值为 True时,Filter属性设置才有效。
其实,在 Table组件中也包含了 Filter和 Filtered属性。所以,Table组件和
Query组件的很多属性都是相同的,而且用法也一样,如 Active,Fields
等,可以参考 Table组件中的相关用法。
12.1.2 Query组件的常用方法
1,Open方法用于打开或激活 Query数据集。一般只执行 Select查询语句。
2,ExecSQL方法执行 Query组件中的 SQL语句,不仅可以执行 Select查询语句,
而且可以执行其他的 SQL命令,如 Insert,Update,Delete等 SQL
命令。关于 Open方法和 ExecSQL方法的区别本书将在后面的章节里进一步地加以讨论。
3,Close方法关闭数据集。
12.1.1 Query组件的常用属性 (3)
4,SQL属性的两个基本方法
( 1) Add方法给 Query组件的 SQL属性添加 SQL命令语句,以供 Query组件执行。 Add
是 SQL属性中的一个方法。如下列语句:
Query1.SQL.Add(?select * from student?);
Query1.SQL.Add(? order by 学号’ );//在前一句 SQL语句的基础上追加
SQL语句这里也可以把以上两句语句合成一句,如下所示。这两种方法是等效的。
Query1.SQL.Add(?select * from student order by 学号’ );
(2) Clear方法
Clear方法是清除 Query组件的 SQL属性值。它也是 SQL属性中的一个方法。一般在用 Add方法添加 SQL语句前,先要用 Clear方法将 SQL属性清空,然后再添加全新的 SQL语句。
12.1.1 Query组件的常用属性 (4)
【 例 12-1】 使用 Query组件显示 student.db中全部记录内容。设计窗体如图 12-1所示,程序运行效果如图 12-2所示。
图 12-1 窗体设计界面 图 12-2 程序运行界面这个例子要求用 Query组件结合 SQL语句显示 student.db中全部记录内容,并显示在 DBGrid组件中。具体实现步骤如下。
在应用窗体中放置一个 Query部件( Query1)、一个 TDataSource部件
( DataSource1)和一个 TDataGrid部件( DBGrid1),并将它们链接起来;
链接方法:将 DataSource1组件的 DataSet属性设置为 Query1;将 DBGrid1组件的 DataSource属性设置为 DataSource1。
设置窗体 Query 部件 Query1的 DatabaseName属性值为数据库别名
stu_data
双击对象查看器 Object Inspector窗口中 Query1的 SQL 属性,Delphi 7.0将显示 String List Editor对话框。
12.1.1 Query组件的常用属性 (5)
【 例 12-1】 使用 Query组件显示 student.db中全部记录内容。设计窗体如图 12-1所示,程序运行效果如图 12-2所示。
图 12-1 窗体设计界面 图 12-2 程序运行界面这个例子要求用 Query组件结合 SQL语句显示 student.db中全部记录内容,
并显示在 DBGrid组件中。具体实现步骤如下。
在应用窗体中放置一个 Query部件( Query1)、一个 TDataSource部件
( DataSource1)和一个 TDataGrid部件( DBGrid1),并将它们链接起来;
链接方法:将 DataSource1组件的 DataSet属性设置为 Query1;将 DBGrid1组件的 DataSource属性设置为 DataSource1。
设置窗体 Query 部件 Query1的 DatabaseName属性值为数据库别名
stu_data
双击对象查看器 Object Inspector窗口中 Query1的 SQL 属性,Delphi 7.0将显示 String List Editor对话框。
12.1.1 Query组件的常用属性 (6)
在图 12-3中的 String List Editor对话框中输入 SQL语句:
Select * from student order by 学号
单击 OK按钮,关闭 String List Editor对话框。
设置 Query的 Open属性为 True。
图 12-3 String List
Editor对话框这样,就可以将 student.db数据表中全部记录内容显示在 DataGrid1组件中。这是一种用 SQL语句查询数据集中记录内容的方法,另外在 Delphi
7.0中用得最多的还是在程序代码中用相应的方法来实现 SQL语句的查询。
利用代码执行 SQL语句,在一般的数据库程序设计中用得很广泛,而且很灵活。但值得注意的是在添加 SQL属性前首先要用 Close方法关闭数据集;
在应用程序中为 SQL属性设置新的 SQL 命令语句时,必须要调用 Clear方法以清除 SQL属性中现存的 SQL命令语句,如果不调用 Clear方法,可调用 Add
方法向 SQL属性中设置 SQL命令语句,那么新设置的 SQL命令语句会追加在现存 SQL命令语句后面,但在程序运行时常常会出现出乎意料的查询结果,
甚至程序无法运行下去。
12.2 动态 SQL语句的编程 (1)
Query组件提供了强大的 SQL语言支持功能,这大大提高了数据库应用程序的执行效率 。 Query组件不仅可以执行静态的 SQL语句,而且可以执行动态的 SQL语句 。 静态 SQL语句在程序设计时便已固定下来,它不包含任何参数和变量 。 而动态 SQL语句,被称为参数化的语句,其中包含着表示字段名或表名的参数 。 在实际程序设计中使用得更多的是动态 SQL语句 。 在这一节将重点介绍如何给动态 SQL语句的参数赋值,以及在应用程序中灵活地使用 SQL语句 。
通常采用以下三种途径来为它赋值,这三种途径都是在程序代码中实现的 。
1,采用字符串连接符号,+”连接组成完整的 SQL语句这里用到字符串连接符号,+”进行字符串的连接操作。具体表示方法如下:
XM='赵凯 '
Query1.SQL.Add('select * from student where 姓名 = '' ' + XM + ' '' ');
注意,在 Delphi 7.0语言的字符串中,连续两个单引号表示一个单引号。
上述 SQL语句中由两个字符串连接符号,+”,三个字符串连接而成,组成了一句完整的查询语句。读者要读懂字符串连接的含义。
12.2 动态 SQL语句的编程 (2)
Query组件提供了强大的 SQL语言支持功能,这大大提高了数据库应用程序的执行效率 。 Query组件不仅可以执行静态的 SQL语句,而且可以执行动态的 SQL语句 。 静态 SQL语句在程序设计时便已固定下来,它不包含任何参数和变量 。 而动态 SQL语句,被称为参数化的语句,其中包含着表示字段名或表名的参数 。 在实际程序设计中使用得更多的是动态 SQL语句 。 在这一节将重点介绍如何给动态 SQL语句的参数赋值,以及在应用程序中灵活地使用 SQL语句 。
通常采用以下三种途径来为它赋值,这三种途径都是在程序代码中实现的 。
1,采用字符串连接符号,+”连接组成完整的 SQL语句这里用到字符串连接符号,+”进行字符串的连接操作。具体表示方法如下:
XM='赵凯 '
Query1.SQL.Add('select * from student where 姓名 = '' ' + XM + ' '' ');
注意,在 Delphi 7.0语言的字符串中,连续两个单引号表示一个单引号。
上述 SQL语句中由两个字符串连接符号,+”,三个字符串连接而成,组成了一句完整的查询语句。读者要读懂字符串连接的含义。
12.2 动态 SQL语句的编程 (3)
2,使用 Params属性为参数赋值
Query组件具有一个 Params属性,它们在设计时不可用,在程序运行过程中可用,并且是动态建立的,当为 Query组件编写动态 SQL语句时,
Delphi 7.0会自动地建立一个数组 Params,数组 Params是以 0下标开始的,
依次对应动态 SQL 语句中的参数,也就是说动态 SQL语句中第一个参数对应 Params [0],第二个参数对应 Params [1],依此类推。
3,使用 ParamByName方法为参数赋值
ParamByName是一个函数,用动态 SQL语句中的参数作为调用
ParamByName函数的参数,这样便可以为它们赋值。使用这种赋值方法,
必须要知道动态 SQL语句参数的名字。
使用这种方法同样可以为各参数赋值,但在 ParamByName方法中必须指明参数名。这样给参数赋值,更加直观一些。注意不要把 Params属性和 ParamByName方法的用法混淆,Params属性中指明的是参数出现的先后次序,从 0开始排序,Params[0]表示第一个参数,Params[1]表示第二个参数,依次类推。而 ParamByName方法要指定参数的名称,所以更加直观、易理解。
12.3 常用 SQL语句简介
SQL是结构化查询语言 。 SQL的大部分实现都与该语言的某个特定定义相关 。 例如,许多数据库的 SQL服务器支持 ANSI-92 SQL定义 。 所使用的
SQL语言的语法依赖于所用的特定数据库 。 结构化查询语言 SQL是定义和维护关系数据库的专用语言,已经被众多的数据库管理系统所采用,如 MS
SQL SERVER,ORACLE,SYBASE,Informix等数据库管理系统 。 事实上,
关于 SQL语言有一个专门的 ANSI标准,而很多数据库管理系统又有自己对标准 SQL语言的扩充 。 Delphi 7.0与使用 SQL语言的数据库管理系统兼容,
在使用 Delphi 7.0开发数据库应用程序时,可以使用 SQL语言编程,开发出功能强大的客户 /服务器程序 。
12.3.1 SQL的优点
SQL的用户包括应用程序员,DBA管理员和终端用户。 SQL语言的优点很多,简述如下。
( 1)非过程化语言
SQL是一个非过程化的语言,因为它一次处理一个记录,对数据提供自动导航。 SQL允许用户在高层的数据结构上工作,可操作记录集,而不对单个记录进行操作。所有 SQL 语句接受集合作为输入,返回集合作为输出。 SQL的集合特性允许一条 SQL语句的结果作为另一条 SQL语句的输入。
( 2)统一的语言
SQL可用于所有用户的 DB活动模型,包括系统管理员、数据库管理员、
应用程序员、决策支持系统人员及许多其他类型的终端用户。基本的 SQL 命令只需很少时间就能学会,最高级的命令在几天内便可掌握。
( 3) SQL是所有关系数据库的公共语言由于所有主要的关系数据库管理系统都支持 SQL语言,用户可将使用 SQL
的技能从一个 DBMS转到另一个。所有用 SQL编写的程序都是可以移植的,从而大大加强了数据库程序开发的灵活性。程序开发人员可以用多种语言编写数据库应用程序,但对数据库维护的 SQL语句的使用是一致的。
12.3.2 SQL语言的基本操作 (1)
SQL语言的作用很广,它最大、最突出的功能就是查询,也是它用得最广的功能。除了查询以外还可以实现记录的插入、修改和删除以及数据表的建立、修改、删除等操作。
1,Select语句
Select语句用于以行为单位从一个或多个表获取数据。现在,把注意力集中到单表的 Select语句上。 Select语句的关键字如表 12-2所示。基本的 Select语句的规范形式如下:
Select字段列表 From表名 Where查询条件 Group by分组字段
Having 分组条件 Ooder by字段名 [ASC|DESC]
一般在程序中应用 SQL语句前,经常要先调试 SQL语句是否书写正确。在 Delphi 7.0中为了调试 SQL语句,提供了数据库浏览器工具 ——SQL
Explorer。数据库浏览器 ——SQL Explorer可以通过 Delphi 7.0主菜单中的 【 Database】 菜单下的
【 Explorer】 菜单项进入,如图 12-5所示。
图 12-5 SQL
Explorer操作窗体
12.3.2 SQL语言的基本操作 (2)
在 SQL Explorer操作窗口的左窗口中选择数据库别名,如 stu_data,可以查看该别名下的数据表中详细内容,包括数据表的定义信息,记录内容和字段等详细信息 。 要调试 SQL语句,可以在右边窗口中选择 Enter SQL选项,
并在文本框中输入 SQL语句 。 例如在上图中输入 select * from STUDENT,
然后单击右边的执行 SQL按钮,如果 SQL语句书写正确就会在下面网格中显示具体的查询结果 。
【 例 12-4】 组合查询记录所谓组合查询就是在查询时查询条件有多个。在 where子句后面各个条件之间用逻辑运算符 and或者 or进行连接,例如要查询姓“李”的“男”学生的记录,则 SQL查询语句应该这样写:
Select * from student where 姓名 like '李 %' and 性别 ='男 '
此例在 【 例 12-2】 的基础上,增加用姓名和性别两个字段的组合查询,
并要求对姓名可以实现模糊匹配查询。在原来的基础上添加 1个标签框
Label2和 1个组合框 ComboBox1,在组合框 ComboBox1中添加“所有”、
“男”、“女” 3个选项,并修改 Button1的 Click事件代码如下:
12.3.2 SQL语言的基本操作 (3)
procedure TForm1.Button1Click(Sender,TObject);
Var StrSql:String; //存放 SQL语句的变量
begin
StrSql:='select * from student Where 1=1 ';
{这个语句是给 StrSql变量赋初值,,1=1”这个条件始终为真,并没有多大意义,
只是为了下面的 SQL语句的连接时方便一些。 }
If Trim(Edit1.Text)<>'' Then
StrSql:=StrSql+' And 姓名 Like ''%'+Trim(Edit1.Text)+ '%''';
//注意字符串的连接方法,两个连续的单引号表示一个单引号
If Trim(Combobox1.Text)<>'所有 ' Then
StrSql:=StrSql+' And 性别 = '''+Trim(Combobox1.Text)+'''';
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add(StrSql);//将 StrSql变量值加到 Query1组件的 Sql属性中
Query1.Prepare;
Query1.Open;
if Query1.Eof then
begin
12.3.2 SQL语言的基本操作 (4)
showmessage('没有找到相关记录! ');
Edit1.Clear;
Combobox1.text:='所有 ';
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select * from student');
Query1.Open;
end
end;
【 例 12-5】 用 SQL语句从 Student.db和 Score.db两张数据表中查询记录内容。
跟前面几个例子一样,在窗体上放置 1个 Query组件,1个 DataSource组件、
1个 DBGrid组件和 1个 DBNavigator组件。如图 12-6所示。将 Datasouce组件的
DataSet属性设置为 Query1,并分别将 DBGrid组件和 DBNavigator组件的
DataSource属性都设置为 DataSource1。
本例要求从 Student.db中选择学生的学号和姓名两个字段的数据,从学生成绩表 Score.db中选择与该学生相关的课程和成绩两个字段的内容,构成一个新的记录集,可在窗体的 OnActivate事件中使用 SQL语句,通过,where student.
学号 =Score.学号”短语将两个表连接起来。 SQL语句表示如下:
图 12-6 多表查询运行界面
12.3.2 SQL语言的基本操作 (6)
具体程序代码如下:
procedure TForm1.FormActivate(Sender,TObject);
begin
Query1.DatabaseName,='stu_data'; //设置 Query组件的别名
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select student.学号,student.姓名,Score.课程,Score.成绩 ');
Query1.SQL.Add(' from student,Score');
Query1.SQL.Add(' where student.学号 =Score.学号 ');
Query1.Open;
end;
当程序运行后,数据显示效果如图 12-5所示,通过 DBNavigator组件可以浏览记录指针,但却不能添加、删除和更新记录内容,请读者自己思考为什么不行?
12.3.2 SQL语言的基本操作 (7)
【 例 12-6】 用 SQL语句从 Student.db统计出男生和女生的人数,如图 12-7
输出 。
图 12-7 输出男女生人数统计表在窗体上放置 1个 Query组件,1个 DataSource组件,1个 DBGrid组件。
将 DataSource组件的 DataSet属性设置为 Query1,并分别将 DBGrid组件的
DataSource属性都设置为 DataSource1。
为了统计男生和女生的人数,需要对 student.db数据表中的记录按性别进行分组。,Group by 性别”可以将性别相同的记录合并成一条记录。要得到统计结果,需要构造一个输出字段,此时可使用 SQL的统计函数 Count()作为输出字段,它按性别分组统计每个分组的记录个数,要显示统计结果,可以用 AS 短语命名一个新的字段别名。本例的 SQL语句书写如下:
Select 性别,Count(*) as 人数 from student Group by 性别
12.3.2 SQL语言的基本操作 (8)
程序代码写在窗体的 OnActivate事件中,具体如下所示:
procedure TForm1.FormActivate(Sender,TObject);
begin
Query1.DatabaseName,='stu_data';
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select 性别,count(*) as 人数 from student Group by 性别
');
Query1.Open;
end;
如果统计每个学生的所有课程的总分,显示学号,姓名和总分三项内容,则 SQL语句又该怎么写呢?这里要查询姓名和成绩,所以必须从两张表中进行链接查询,SQL语句表示如下:
select score.学号,student.姓名,sum(score.成绩 ) AS 总分 from
score,student
Where score.学号 =student.学号 Group by score.学号,student.姓名
12.3.2 SQL语言的基本操作 (9)
2,Delete语句
Delete语句非常简单,它的作用是用来删除数据表中的记录。具体格式如下:
Delete from 表名 where条件该命令将删除数据表中满足条件的所有记录内容。更常见的情况是需要删除数据的特定行。对这种情况,添加 Where子句即可。 Delete语句仅仅删除指定条件的记录,并不是删除数据表;如果没有指定删除条件,则删除数据表中的所有记录。
2,Delete语句
Delete语句非常简单,它的作用是用来删除数据表中的记录。具体格式如下:
Delete from 表名 where条件该命令将删除数据表中满足条件的所有记录内容。更常见的情况是需要删除数据的特定行。对这种情况,添加 Where子句即可。 Delete语句仅仅删除指定条件的记录,并不是删除数据表;如果没有指定删除条件,则删除数据表中的所有记录。
图 12-8 删除指定学号的学生记录
12.3.2 SQL语言的基本操作 (10)
确定删除”按钮的 Click事件代码如下:
procedure TForm1.Button1Click(Sender,TObject);
begin
if MessageDlg('你真的要删除学号为 '+trim(Edit1.Text)+'的学生记录吗?
',mtwarning,mbOKCancel,1) =mrOK then
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('Delete from student where 学号 =:XH');
Query1.ParamByName('XH').AsString:=TRIM(EDIT1.Text);
Query1.ExecSQL; //必须调用 ExecSQL方法执行 Delete语句,没有返回结果
//重新获取 student表中的所有记录
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select * from student');
Query1.Open; //查询语句要用 Open方法执行,返回一个记录集
end;
end;
12.3.2 SQL语言的基本操作 (11)
3,Insert语句
Insert语句更为复杂。它用于向表添加行。 Insert语句可用于向所有的字段添加值,也可以只对某些字段添加值,这依赖于具体使用的 Insert语句。
由于这个原因,Insert语句需要表名、字段列表,以及与每个字段相匹配的值。语句的具体形式如下:
Insert into 数据表名 (字段名 1,字段名 2,…)
Values(字段值 1,字段值 2,…)
说明:
( 1)如果没有指定字段名,系统则会按数据表中字段的先后顺序插入数据;
( 2)字段值的数据类型必须与对应字段的数据类型相吻合;
( 3)数据表名可以是可以更新的视图名称,也可以是经过子查询把别的数据表中的内容插入。
【 例 12-8】 使用 Insert语句插入记录。
在 【 例 12-1】 的基础上添加如图 12-9所示的几个组件,1个 GroupBox组件,7
个标签框( Label1~ Label7),7个编辑框( Edit1~ Edit7)和 2个命令按钮
procedure TForm1.Button1Click(Sender,TObject);
//“插入”按钮 Click事件过程
Var xh,xm,xb,csrq,zzmm,jg,rxcj,string;
begin
Try {开始捕捉错误 }
Query1.Close;
query1.SQL.Clear;
//在 SQL语句中,字符类型和日期型的字段值必须加单引号,数值型字段不需要加单引号
xh,=''''+edit1.Text+''''; //学号,需加引号
xm,=''''+edit2.Text+'''' ; //姓名
xb,=''''+edit3.Text+'''' ; //性别
csrq,=''''+edit4.Text+''''; //出生日期
zzmm,=''''+edit5.Text+'''' ; //政治面貌
jg,=''''+edit6.Text+'''' ; //籍贯
rxcj,=edit7.Text ; //入学成绩,不需要加单引号
12.3.2 SQL语言的基本操作 (12)
( Button1~ Button2)。 7个标签框分别标注 student.db数据表中的 7个字段名,
(图 12-9 使用 insert语句插入记录 )
12.3.2 SQL语言的基本操作 (13)
query1.SQL.Add('Insert into student values('+ xh +','+ xm +','+ xb +','+
csrq +','+ zzmm +','+ jg +','+ rxcj +')');
query1.SQL.Add('Insert into student Values(''030117'',''李香香 2'',''女
'',''4/5/45'',''团员 '',''浙江 '',442)');
query1.ExecSQL;
Except
on EDBEngineError do //如果数据库操作发生错误,则显示提示信息。
begin
application.MessageBox('数据库登录错误;请检查 【 学号是否重复! 】
'+#13+#10+'
或者 【 字段值是否为空! 】 或 【 字段类型是否匹配! 】 ','错误!
',MB_OKCANCEL);
end;
end;
//重新显示全部记录内容
with query1 do
begin
close;
12.3.2 SQL语言的基本操作 (14)
4,Update语句
Update语句用于修改现存的记录。 Update语句如果不使用 where子句,将更新所有的记录。大多数情况下都需要限制更新记录的条件,但所有的更新都从基本的语句开始。 SQL语言中 Update的语法如下:
Update 数据表名 set 字段名 1 = 字段值 1 [,字段名 2 = 字段值 2,字段名 N = 字段值 N] Where 更新条件该语句以关键字 Update开始,后接数据表名。 set子句后接逗号分隔的列表,
包括所要更新的字段及其新值。
【 例 12-9】 使用 Update语句修改记录。
界面跟 【 例 12-8】 基本保持不变,只添加一个 Memo1
组件,用来显示 SQL语句。具体界面如图 12-10所示。
图 12-10 使用 Update
语句修改记录程序要求先单击 DBGrid1组件,选择一条要修改的记录,并将该记录的各字段值分别显示到对应的编辑框中,供用户修改。修改完毕后,单击“确定修改”按钮调用 SQL语句中的 Update命令提交修改,并将
Update语句显示在 Memo1组件中。具体代码如下:
12.3.2 SQL语言的基本操作 (15)
procedure TForm1.Button1Click(Sender,TObject);
Var
xh,xm,xb,csrq,zzmm,jg,rxcj,string;
begin
//在 SQL语句中,字符类型的字段值必须加单引号,数值型字段不需要加单引号
xh,=''''+edit1.Text+''''; //学号
xm,=''''+edit2.Text+'''' ; //姓名
xb,=''''+edit3.Text+'''' ; //性别
csrq,=''''+edit4.Text+''''; //出生日期
zzmm,=''''+edit5.Text+'''' ; //政治面貌
jg,=''''+edit6.Text+'''' ; //籍贯
rxcj,=edit7.Text ; //入学成绩
Try
query1.Close;
query1.SQL.Clear;
query1.SQL.Add('Update student set 姓名 ='+ xm +',性别 ='+ xb +',出生日期
='+ csrq +',政治面貌 ='+ zzmm +',籍贯 ='+ jg +',入学成绩 ='+ rxcj);
query1.SQL.Add(' WHERE 学号 ='+xh);
12.3.2 SQL语言的基本操作 (17)
memo1.Text,=query1.SQL.Text ; //在 Memo1中显示 SQL语句
query1.ExecSQL;
Except
on EDBEngineError do
begin
application.MessageBox('数据库登录错误;请检查,'+#13+#10+'
【 字段值是否为空! 】 或 【 字段类型是否匹配! 】 ','错误! ',MB_OKCANCEL);
end; end;
//重新显示全部记录内容
with query1 do
begin
close;
sql.Clear;
sql.Add('select * from student order by 学号 ');
open;
end; end;
{单击 DBGrid1组件中的一条记录时,在文本框中显示选中记录内容 }
12.3.2 SQL语言的基本操作 (18)
procedure TForm1.DBGrid1CellClick(Column,TColumn);
begin
with query1 do
begin
edit1.Text,= fieldbyname('学号 ').AsString ;
edit2.Text,= fieldbyname('姓名 ').AsString ;
edit3.Text,= fieldbyname('性别 ').AsString ;
edit4.Text:=formatdatetime('mm''/''dd''/''yyyy',strtodate (fieldby
name('出生日期 ').AsString));
//将日期转换成,月 /日 /年”格式,显示在 Edit4中。
edit5.Text,= fieldbyname('政治面貌 ').AsString ;
edit6.Text,= fieldbyname('籍贯 ').AsString ;
edit7.Text,= fieldbyname('入学成绩 ').AsString ;
edit2.SetFocus ;
end; end;
12.3.2 SQL语言的基本操作 (19)
前面通过众多例子详细分析了 SQL语句中的 Select,Insert,Update和
Delete语句在 Query组件中的具体应用。 SQL语言在数据库编程中运用十分广泛,这仅仅是一个开始,对于 SQL语句的高级应用,读者可以参考相关 SQL
语言参考书,这里由于篇幅有限将不再讲述。同时,本节会在后面的例子中或多或少地提到 SQL语言的使用。注意以下两点。
( 1)在前面学习的四个 SQL语句中,SELECT语句在 Query组件调用时,可以用 Open方法来调用,也可以用 ExecSQL方法调用;而后面三种 Insert、
Update和 Ddelete语句只能用 ExecSQL方法调用。 Open方法和 ExecSQL方法的区别在于前者可以返回一个记录集结果,而后者没有返回结果。
( 2)在数据库程序开发当中,运用字符串和字符变量连接构成完整的 SQL语句的做法运用相当普遍,用这种方法实现动态 SQL语句十分灵活,且功能十分强大,读者应好好掌握其用法,这将会给编程带来很大的方便。
12.4 Query组件的综合应用举例 (1)
【 例 12-10】 用 Query 组件设计一个学生信息管理程序,数据表为
student.db,实现学生信息的增加,删除,修改和查询,过滤等基本功能 。
程序运行界面如图 12-11所示 。
本程序的具体功能如下。
1,在如图 12-11所示的主窗体中查询和过滤各种条件的记录。检索可以按照学号和姓名两个字段进行查询,还可以选择是否模糊查询。
2,过滤记录。可以按照政治面貌和性别过滤记录内容。
3,单击添加按钮可以弹出图 12-12所示的“添加学生信息”窗体,在新窗体中添加学生记录。
4,在 DBGrid组件中选中一条记录,再单击编辑按钮或者双击 DBGrid组件,
可以弹出“修改学生信息”窗体,
在弹出窗体中修改当前学生记录。
图 12-11 学生信息管理程序主界面图 12-12添加学生信息窗体图 12-13学生信息修改窗体
12.4 Query组件的综合应用举例 (2)
5,单击删除按钮,删除当前记录。
本程序共 3个窗体,主窗体如图 12-11所示,窗体名称为,FormMain;添加学生信息窗体如图 12-12所示,窗体名称为,AddForm;编辑学生信息窗口如图
12-13所示,窗体名称为,EditForm。
程序中共用到两个 Query组件,名称分别为 Query1和 Query_cTemp,一个数据源组件 DataSource1,将它和 Query1组件连接,其他数据控制组件如
DBGrid组件通过 DataSource1组件和 Query1组件建立通信。两个 Query组件
Query1和 Query_cTemp连接的数据源都是 student.db数据表,别名为 stu_data。
Query1组件只用来显示查询记录内容到 DBGrid组件中和其他组件中,而
Query_cTemp组件主要用来添加和修改新记录。按图所示添加其他组件,并设置相关属性。
其中删除记录、添加记录及查询记录的相关程序代码详见本教程 P242~P245
页。