第十二讲 C++ Builder利用ADO控件进行数据库编程.docx
《第十二讲 C++ Builder利用ADO控件进行数据库编程.docx》由会员分享,可在线阅读,更多相关《第十二讲 C++ Builder利用ADO控件进行数据库编程.docx(22页珍藏版)》请在冰点文库上搜索。
第十二讲C++Builder利用ADO控件进行数据库编程
河南科技大学教案首页
课程名称:
数据库开发技术
计划学时:
40
授课章节:
第十二讲C++Builder利用ADO控件进行数据库编程
教学目的和要求:
让学生知道为了保证软件的质量需要一个合适的软件开发方法做指导。
了解数据库应用程序的开发过程和各阶段的任务。
教学基本内容:
课程在专业中的地位。
课程对于专业技能训练的的重要性,学习的目标,学习方法。
数据库系统、数据库应用系统体系结构、DBMS的功能、数据库应用开发环境、简单回顾关系模型、SQL语言。
教学重点和难点:
关于数据库应用系统体系结构的理解是难点。
重点是指导这门课程在专业学习中的位置,以及确定怎样的学习目标。
授课方式、方法和手段:
由于大多是以往的知识介绍和课程学习目标的要求,气氛尽可能轻松一些。
多媒体。
介绍以前的内容时不要死板地按部就班地介绍,避免重复讲课令人乏味的感觉。
作业与思考题:
•去了解一下其它几种软件体系结构
•了解当前流行的各种编程语言,选择一个自己喜欢的专攻方向,总结一下选择的理由。
•教材中列出的几种数据库应用系统,哪些数据可以保存到数据库中?
说明:
1.教案首页中各栏目内上下尺寸可自行调整
2.教案首页后续也河南科技大学教案专用纸书写,或使用A4纸打印。
第十二讲
C++Builder利用ADO控件进行数据库编程
12.1数据控制组件的使用
12.1.1数据控制组件的属性和方法
除了DBNavigator,大多数的数据控制组件是从标准控件演变过来的,它们与位于Standard页上的相应控件具有相似的特性,如TDBGrid和TStringGrid、TDBEdit和TEdit、TDBListBox和TListBox等在外观及属性与方法的使用上都是非常相似的。
差别在于数据控制组件是专门用于显示和编辑数据库中记录的字段信息的,它们必须通过DataSource组件与数据集中具体的字段连接。
DBGrid组件可以直接对二维数据表进行浏览编辑,是最常用的数据控制组件。
在例5-1中我们通过设置DataSource属性将DBGrid与数据集相联系。
下面介绍一下DBGrid的其它常用属性。
Align属性用于定位,Color、Font、TitleFont属性用于字体和颜色,BorderStyle属性指定边框的形式,这几个属性都是控制DBGrid和显示数据外观的。
还有一个ReadOnly属性可控制数据是否允许被修改,该属性为true时数据为只读。
Columns属性可用来进一步控制DBGrid的各个列。
点击该属性值右端的“...”按钮打开“EditingDBGrid1Columns”对话框,就能对DBGrid的列进行设置。
在该对话框点击“AddAll”图形按钮,使出现已连接数据集中的全部字段。
如果不想让某字段在DBGrid中显示,可右击该字段在弹出的快捷菜单上执行“Delete”命令。
在该对话框中选中一个列(字段)(或者在ObjectTreeView选中),然后就可以在ObjectInspector中对该列进行设置。
这些列属于TColumn类,每个列都有Color、DropDownRows、Font、PickList、ReadOnly、Title等属性,其中Title还有其自己的子属性。
使用DropDownRows和PickList属性,该列在输入时,当前单元格中会出现一个像组合框那样的控件供用户选择。
图5-9是正在对例5-5程序中的DBGrid修改Columns属性设置的画面,修改后各个列都使用中文标题,第一列的底色设置为蓝色,第二列使用的字体为粗斜体。
DBNavigator组件主要用于对数据集进行导航以及为用户操纵数据集中的记录提供一组简单明了的控制按钮,DBNavigator组件中各按钮对应的命令如图5-10所示。
图5-9是正在对例5-5程序中的DBGrid修改Columns属性设置的画面,修改后各个列都使用中文标题,第一列的底色设置为蓝色,第二列使用的字体为粗斜体。
DBNavigator组件主要用于对数据集进行导航以及为用户操纵数据集中的记录提供一组简单明了的控制按钮,DBNavigator组件中各按钮对应的命令如图5-10所示。
图5-9修改程序中DBGrid的Columns属性设置
图5-10DBNavigator组件中的按钮
在本章例5-1中我们曾经使用过DBNavigator组件,我们设置它的DataSource属性以连接数据源,实现对数据集的控制。
DataSource是DBNavigator和其它DataControls组件最基本的属性。
DBNavigator组件的另一常用属性是VisibleButtons,用于选择DBNavigator组件的各个按钮是否显示。
因为在实际应用中可能用不到那么多按钮,所以希望有些按钮不要显示。
比如在浏览数据库的应用程序中,一般只需要First、Previous、Next、Last四个按钮就行了。
设置该属性时,应点击ObjectInspector中位于VisibleButtons左面的“+”按钮,打开它的子属性表将各个按钮分别设置为true或false,凡是设置为false的均不显示,如图5-11所示。
图5-11设置VisibleButtons属性
11.1.2数据表单程序的设计
在商业和管理方面的一些应用中,常涉及到填写及处理某种形式的表格或表单(Form,但不是指BCB中的窗体)。
一般BCB程序中可使用一个窗体来处理这种表单。
而表单中的数据,通常可作为数据集中的一条记录。
对表单的操作应按实际需要设计,但一般至少包含浏览、编辑、插入、删除(该操作通常要受到一点限制)等基本操作。
使用数据访问和数据控制组件,很容易编写这样的程序。
下面给出一个范例。
【例5-6】设计一个能处理人事信息的简单数据表单程序,程序运行时的画面如图5-12所示。
>制作步骤
(1)建立本范例中使用的数据表“职工.db”。
图5-13为在DatabaseDeskTop中设计该表的结构,我们看到在该表中有姓名、工号、性别、工资、职务等字段。
为方便起见,我们将该表与本例中的程序存放在同一个文件夹内。
图5-12数据表单程序运行时
图5-13职工.db表的结构
(2)在Form1窗体中加入数据访问组件Tabe1和DataSource1并使它们与数据表连接。
我们将Table1的DatabaseName设置为“.\”,将TableName设置为“职工.db”;将DataSource1的DataSet设置为Table1。
(3)在窗体上放置五个数据控制组件DBEdit1、DBEdit2、DBEdit3、DBRadioGroup1和DBComBoBox1。
它们的DataSource属性都设置为DataSource1,DataField属性分别设置为“姓名”、“工号”、“工资”、“性别”和“职务”。
对DBRadioGroup1还要设置Columns属性为2,设置Items为“男”、“女”。
对DBComBoBox1,设置Items为“经理”、“主任”、“科长”、“资料员”和“员工”等。
(4)为了对表单上需填写的数据进行说明,我们还要在窗体内放上五个Label,它们的Caption属性分别为“姓名”、“工号”、“性别”、“工资”和“职务”。
(5)往窗体上放一个Panel1控件,将它的Align属性设置为alRight。
再往Panel1上放八个Button按钮,它们的Caption分别为“First”、“Prior”、“Next”、“Last”、“Insert”、“Delete”、“Post”和“Quit”等。
以下是程序中窗体和按钮事件的处理代码:
void__fastcallTForm1:
:
Button1Click(TObject*Sender)
{
Table1->First();
Button1->Enabled=false;
Button2->Enabled=false;
Button3->Enabled=true;
Button4->Enabled=true;
}
//-----------------------------------------------------------------------
void__fastcallTForm1:
:
Button2Click(TObject*Sender)
{
Table1->Prior();
Button3->Enabled=true;
Button4->Enabled=true;
if(Table1->Bof)
{Button1->Enabled=false;
Button2->Enabled=false;
}
}
//------------------------------------------------------------------------
void__fastcallTForm1:
:
Button3Click(TObject*Sender)
{
Table1->Next();
Button1->Enabled=true;
Button2->Enabled=true;
if(Table1->Eof)
{Button3->Enabled=false;
Button4->Enabled=false;
}
}
//------------------------------------------------------------------------
void__fastcallTForm1:
:
Button4Click(TObject*Sender)
{
Table1->Last();
Button1->Enabled=true;
Button2->Enabled=true;
Button3->Enabled=false;
Button4->Enabled=false;
}
//------------------------------------------------------------------------
void__fastcallTForm1:
:
Button5Click(TObject*Sender)
{
Table1->Insert();
}
//-------------------------------------------------------------------------
void__fastcallTForm1:
:
Button6Click(TObject*Sender)
{
Table1->Delete();
}
//-------------------------------------------------------------------------
void__fastcallTForm1:
:
Button7Click(TObject*Sender)
{
Table1->Edit();
Table1->Post();
}
//-------------------------------------------------------------------------
void__fastcallTForm1:
:
Button8Click(TObject*Sender)
{
Table1->Close();
Close();
}
【评析】
(1)程序中各个按钮的功能也可利用DBNavigator组件实现,但使用DBNavigaor难以扩充或修改其功能,也不能改变其外观。
所以,对较复杂的数据表单程序必须编写事件代码,本范例中的代码有一定的参考价值。
(2)数据输入或修改是在数据控制组件中进行的,一般要在执行“Post”方法时才将改变后的数据写入数据表。
但对于本地数据集,BDE在执行“Next”、“Prior”等方法之前会自动调用Post。
(3)本例仅具有最基本的数据表单处理功能,存在诸多不完善。
如删除记录时无任何限制,也没有提供警告信息;程序关闭时,若数据已经过修改但还没有执行Post,一般应该有提示信息,但程序中忽略了。
读者在实际编写数据库应用程序时要注意这些方面的完善。
(4)本例一般只能在单用户环境下运行,要使程序能在客户/服务器环境下正常工作,还要考虑更多的因素,并为程序提供异常保护。
12.2TQuery组件的使用
结构化查询语言(SQL,StructuredQueryLanguage)具有功能丰富、语言简洁、使用灵活方便等特点,在计算机用户中广泛使用,已经成为数据库语言的国际标准。
目前大多数运行于服务器上的数据库管理系统都支持SQL,因此使用SQL有利于开发客户/服务器结构的数据库应用程序。
虽然SQL已经成为标准,但是很多数据库厂商对SQL进行了不同程度的扩展。
如果在应用程序中使用了非标准的SQL,会给系统的移植带来困难。
12.2.1结构化查询语言SQL
我们假定读者有一定的SQL或关系数据库理论的基础,这里仅简单介绍SQL的最基本语句。
这些语句是:
SELECT、INSERT、UPDATE、DELETE、CREATE和DROP。
1.SELECT语句
SELECT语句是SQL中使用最频繁的语句。
在SELECT中可以查询指定数据表中的指定字段值,并可将这些指定的字段值组成的记录放在一个动态集或表中作为返回结果,以便用户对其进行处理。
SELECT语句最基本的格式如下:
SELECT<字段列表>FROM<表>
[WHERE子句]
[GROUPBY子句]
[HAVING子句]
[ORDERBY子句]
说明:
(1)“字段列表”指定需要输出的字段或表达式,这些字段一般应来自由FROM指定的表。
当字段名中间有空格时,必须将该字段名用方括号括起来。
如果要查询表中所有的字段值,可以使用通配符“*”取代字段列表。
(2)WHERE子句可以对表记录指定过滤条件。
(3)GROUPBY子句是针对记录分组的,输出的每一条记录代表原始数据中的一个组,在输出中可以按组进行统计。
(4)HAVING子句仅在分组时有意义,它对已产生的组进行过滤。
(5)ORDERBY子句对输出结果指定排序方式。
(6)查询的结果可生成临时表。
(7)SELECT语句中还可以使用JOIN子句连接多个表作为输入数据。
2.INSERT语句
INSERT语句用于将一个记录或一组记录添加到指定的表中。
它的格式如下:
INSERTINTO<表>[<字段列表>]VALUES(<数据1>[,<数据2>]......)
例如:
INSERTINTOAuthorsVALUES(18188,'Mike',1999)
说明:
(1)当需要插入表中所有的字段时,“字段列表”可以省略;
(2)应保证插入数据的顺序、数据类型和项数要与字段列表中一致;
(3)主索引字段应保证不与表中已有的字段值重复且本身也不为空。
3.UPDATE语句
UPDATE语句用于更新数据库中的数据,其格式如下:
UPDATE<表>SET<数据设置表达式>[WHERE<逻辑表达式>]
UPDATE语句的作用是对表中满足逻辑表达式的记录更新指定的字段。
其中,数据设置表达式的格式为<字段名>=<新数据>。
当有多个表达式时,用逗号进行分割。
例如:
UPDATEAuthorsSETAuthors.Author="Scott,John"
WHEREAuthors.Au_ID=888
4.CREATE语句
CREATE语句用于创建表或索引。
用于创建表时,应同时指定表中字段的名称、数据类型和长度。
语句格式如下:
CREATETABLE<表>
(<字段1><数据类型1>[<长度1>],
<字段2><数据类型2>[<长度2>]......)
5.DELETE语句
DELETE语句用于删除表中满足条件的记录,其格式如下:
DELETEFROM<表>[WHERE<逻辑表达式>]
DELETE语句的作用是删除表中满足逻辑表达式的记录,如果省略WHERE子句,那么删除表中所有记录。
例如:
DELETEFROMAuthorsWHERE[YearBorn]<1900
6.DROP语句
DROP语句主要用于删除数据库中的表,其格式如下:
DROPTABLE<表>
用DROP语句删除表与用DELETE删除表中的记录是不同的,DROP语句删除整个表及其相关的索引。
而使用DELETE语句,即使删除表中所有的记录,该表及其相关索引也依然存在,只不过表的内容被删除了。
1.联机交互式
执行Database→Explore菜单命令打开“SQLExplorer”,在左面的窗口中选择某个数据库别名,打开它的Tables节点。
在右面进入“EnterSQL”页输入SQL命令,然后点击按钮即可运行该SQL语句,右下方的窗口则显示查询的结果,如图5-14所示。
2.嵌入式
C++Builder中,可以使用TQuery类组件的SQL属性或Open及ExecSQL方法中嵌入SQL查询语句,具体的使用将在后面详细介绍。
图5-14在SQLExplorer中执行SQL命令
12.2.2TQuery组件的属性和方法
本节我们将介绍如何使用TQuery类组件,以及如何通过SQL命令在一个或多个数据表中检索、插入、更新和删除数据。
Query组件位于组件面板的BDE页上。
TQuery组件在SQL编程中占据了十分重要的位置,它实现了BCB对SQL语言的支持。
TQuery组件支持SQL语言,因而具备了强大的关系查询能力,TQuery组件可以访问的数据库有:
(1)Paradox或者Dbase数据库,这时使用的是本地SQL,支持SQL-92标准语法。
(2)本地InterBaseServer数据库,这时使用的是InterBase引擎,支持SQL-92标准语法及扩展语法。
(3)远程数据库服务器上的数据库,例如Oracle,Sybase、MS-SQLServer、Informix、DB2和InterBase。
必须安装相应的SQLLink驱动器来访问不同的远程服务器,只要是服务器支持的SQL语法我们都可以使用。
TQuery类除了继承其父类TDBDataSet的成员外,还有许多自己的属性和方法。
表5-2和表5-3列举了它的一些重要属性和方法。
表5-2Query组件的重要属性
表5-3Query组件的重要方法
12.2.3使用Query组件的一般步骤
在BCB应用程序中使用Query组件执行SQL命令有两种方式:
静态SQL语句和动态SQL语句。
静态SQL语句是指程序设计阶段,将SQL命令文本作为Query组件的SQL属性值设置;而动态SQL语句是在程序运行中根据用户需求动态生成SQL命令语句并执行。
此外,BCB还允许在SQL语句中包含一系列的参数,在程序运行时这些参数值是可变的,即可以动态地给SQL语句中的参数赋值。
1.设置Query组件
设计时设置Query组件的一般步骤如下:
(1)把一个Query组件放到窗体上。
(2)设置Query组件的DatabaseName属性,指定我们要查询或操作的数据库别名。
如果访问的是本地数据库的话,也可以使用数据库所在的路径名。
如果在应用程序中使用了Database组件,我们可以把Query组件的DatabaseName属性设置为Database组件的DatabaseName属性中定义的本地BDE别名。
(3)把一条SQL语句写入Query组件的SQL属性中,根据需要可在Query组件的Params属性中设置SQL语句的参数。
(4)在窗体或数据模块中放置一个DataSource组件,把它的DataSet属性设置为Query组件的名字。
DataSource组件可用来把TQuery组件查询的结果返回给数据浏览组件显示。
再将DataControls组件与DataSource相连,然后设置Query组件的Active属性为true。
如果以上步骤操作没有错误,此时就可以通过DataControls组件看到查询的结果。
2.使用Query组件
使用Query组件在运行时执行SQL命令的一般步骤如下:
(1)调用Close方法关闭Query组件。
(2)清除SQL属性中原先输入的SQL命令。
(3)动态设置Query组件的SQL属性。
由于SQL属性的类型为TStrings,我们可以分几次调用Add方法写SQL属性。
(4)调用ParamByName方法来设置SQL语句的参数。
如果不需要参数,这一步可省略。
(5)调用Query组件的Prepare方法来初始化BDE并将参数传送给SQL语句,这一步不是必须的,但我们建议这么做。
(6)调用Query组件的Open或ExecSQL方法来执行SQL命令。
Open用于执行SELECT查询命令;如执行Insert、Delete等不需要返回结果的命令,则应调用ExecSQL方法。
Query组件的SQL属性是一个TStrings类型的一个字符串。
SQL属性一般只包含一条完整的SQL语句,但可以分成几行写。
把SQL语句分成几行写的好处是,SQL语句的逻辑结构看得比较清楚,有利于维护和调试。
例如,我们一般都把SQL语句中的SELECT子句和WHERE子句写在不同的行。
下面举一个利用Query组件动态执行SQL查询的例子。
【例5-7】在窗体上放一个Query组件、一个DataSource组件和一个DBGrid组件。
将Query1的DatabaseName属性选择为BCDEMOS,在SQL属性中输入SELECT*FROMCountry;将DataSource1的DataSet属性选为Query1;再将DBGrid1的DataSource属性选择为DataSource1;最后将Query1的Active设置为true。
如果以上操作没有错误,此时就能在DBGrid中显示查询的结果。
我们看到Country表的每一条记录是一个国家的基本情况,有国名(Name)、首都(Capital)、面积(Area)、洲(Continent)和人口(Population)等列。
为了能按照用户要求进行动态查询,窗体中再加入两个组合框、一个编辑框和一个“查询”按钮。
ComboBox1用于让用户选择一个洲名,我们在它的Items中输入各个洲的名称,并清空Text属性。
在ComboBox2的Items中输入“<”、“=”、“>”,清空Text。
对Edit1也清空Text,Edit1配合ComboBox2,使用户能指定人口数量的范围(如Population<50000000)。
程序运行时,用户可以选择某个洲,并输入一个人口的范围,然后点击“查询”按钮。
查询完成后,在DBGrid中显示查询结果,如图5-14所示,图中查询的条件是位于NorthAmerica洲的人口大于20000000的国家。
图5-14使用Query