2023年12月15日发(作者:)

数据库编程基础
到上一讲为止,我们的音乐收藏小程序Mp3Collect的第一个版本已经完成了,这个版本的实现是基于文件的,具有简单的记录编辑和管理能力,但它也存在一些缺陷,因此在接下来的几讲中,我们就来编写Mp3Collect的第二个版本,第二版将利用数据库来保存记录,并具备访问查询数据库的能力。由于数据库在讲座中是全新的内容,所以在动手编程之前,心铃首先介绍一下在CBuilder中进行数据库编程的一些基础知识。
什么是数据库
通常我们在谈论数据库的时候,很容易把数据库(Database)、数据库管理系统(Database
Management System)、和数据库应用程序(Database Application)混在一起,实际上,它们是构成数据库应用系统的三个组成部分,其中数据库是按照一定的结构组织在一起的相关数据的集合;数据库管理系统是建立、使用和管理数据库的软件系统,简称为DBMS;而数据库应用程序则是具有数据库访问能力的应用程序,它提供用户一个访问和操作特定数据库的用户界面。
举例来说,我们常用的Office办公套件中有一个Access软件,它就是一种数据库管理系统,如果利用Access创建一个文件用于保存MP3音乐信息,那么这个文件就是一个数据库,而将要编写的第二版能够访问中保存的记录信息,因此它是一个数据库应用程序。
数据库和数据库管理系统是密切相关的,通常我们称某某数据库是某一类型的数据库,就是按照该数据库管理系统的名称来命名的。例如,可以称为一个Access数据库。数据库管理系统不仅可以直接访问某一类型的数据库,还可以提供给其它应用程序一个访问该类型数据库的引擎(即驱动程序),这样,应用程序在访问数据库时就不用考虑数据库的物理存储方式、检索算法的实现等具体问题,而只要把命令传给数据库引擎,然后从数据库引擎处获取结果数据就可以了。
根据数据库对数据组织方式的不同,数据库管理系统又分为几种类型,如关系数据库、对象数据库等。其中关系数据库以表格的形式存储数据,是目前应用最广泛的数据库管理系统。我们讲座中要用到的Access就是一种关系数据库管理系统。一个关系数据库是由一个或多个数据表(Table)组成,而一个数据表又是由许多结构相同的记录(Record)组成,每条记录相当于数据表的一行,数据表的列又称为字段(Field),字段定义了该项数据内容的数据类型、数据宽度等。有些数据库是以文件形式存在的,例如Access的一个MDB文件就是一个数据库,其所有的数据表都包含在文件的内部,而有些数据库则是指一个目录,例如Paradox和dBase就是使用目录的数据库,每个数据表在该目录下以独立的文件形式存在。
CBuilder数据库开发环境
CBuilder在其开发环境中提供了强大的数据库支持,使CBuilder开发的应用程序能够很方便地具有数据库访问能力。
首先,CBuilder提供了Borland公司的数据库引擎(Borland Database Engine,简称BDE),它是CBuilder数据库应用程序开发环境的核心。BDE位于应用程序和DBMS的数据库引擎之间,使得应用程序可以更加方便地访问不同类型的数据库。BDE支持直接访问Paradox和dBase数据库,通过合适的驱动程序和数据库引擎,BDE还可以访问FoxPro、Access、Infomix、DB2、Oracle等多种流行的桌面数据库和远程数据库,同时BDE也是CBuilder提供的众多数据库元件的功能基础。
CBuilder中包含了大量和数据库应用程序相关的元件,它们可分为数据库访问元件和数据控制元件。数据访问元件位于Data Access元件栏中,主要包括DataSource控件、Table控件、Query控件等。数据访问元件在运行过程中是不可见的,它主要是为应用程序提供一条访问数据库的通道。数据控制元件位于Data Controls元件栏中,它们为应用程序提供可视化的用户界面,常用的数据控
制元件包括DBNavigator、DBGrid、DBEdit、DBText等。很多数据控制元件都是在普通的用户界面元件的基础上增加了数据感知能力,如DBEdit控件(数据库编辑控件),它不仅具有普通Edit控件的用户输入、编辑、浏览文本的能力,还可以和数据库访问元件关联在一起,从而具有浏览、编辑数据库记录的能力。
在CBuilder中开发数据库应用程序的基本思路是:使用数据访问元件与数据库建立联接,获取所需的数据集(Dataset),并将数据控制元件与数据访问元件相关联,实现用户浏览、操作数据的界面。
CBuilder的数据库开发环境中还包括几个工具软件,它们是BDE管理器(BDE Administrator)、SQL浏览器(SQL Explorer)、数据库桌面(Database Desktop)等。
BDE管理器是BDE管理和配置的工具软件,它可以创建和维护BDE数据库别名(Alias),安装和删除数据库驱动程序。其中数据库别名是BDE引入的一个重要概念,它的意义和创建方法将在后面进行介绍。
数据库桌面是一个简单的数据库管理工具,可以进行许多基于数据表的操作,如创建数据表、修改数据表的结构以及查看和编辑数据表的内容等等。
SQL浏览器是一个数据库浏览工具,可以浏览数据库中的各种对象,如数据表、字段、索引等,还可以创建和维护数据库别名,编辑和显示数据表中的记录,以及对数据表执行SQL查询等。其中,SQL的全称是结构化查询语言(Structured Query Language),它是目前使用得最广泛的一种标准的数据库查询语言,几乎所有的数据库都支持SQL语言。
建立一个ACCESS数据库
下面,我们以Mp3Collect程序为例,一步一步地学习如何在CBuilder中开发数据库应用程序。第一步需要建立一个数据库。我们以Microsoft的Access 2000为例来说明创建数据库的方法。选用Access 2000是因为它是目前比较流行的桌面数据库,使用和管理起来都很方便。
首先启动Access 2000,选择新建空的数据库,在要求输入数据库名称和路径时输入“”(即Mp3Collect所在目录)。接下来在新建的空白数据库中选择表对象,并双击其中的“使用表设计器创建表”命令,创建一个数据表。
在表设计器中,依次定义四个字段:ID、FileName、SongName和SingerName。后面三个字段的意义我们已经非常熟悉了,它们的数据类型定义为文本,FileName的字段大小为255,其它两个字段的大小为50,并且FileName字段中不允许空字符串,而SongName和SingerName允许空字符串。另外,我们还要为这三个字段添加允许重复的索引,因为在程序中需要按照这三个字段对数据库进行查询,添加了索引的字段,可以加快查询的速度。ID是自动编号类型的字段,这个字段的引入是为了给每个记录一个唯一的数字标识,在关系数据库中,这样的数字标识对提高访问效率和系统性能很有用。另外,由于每条记录的ID是唯一的,我们可以为ID添加无重复的索引,并且指定其新值的产生方式为递增。设置好这四个字段以后,关闭表设计器,这时Access会提示输入新表的名称,这里我们将其命名为MP3Info。
这样,数据库就创建好了,虽然这只是一个简单的单数据表的数据库,但是通过创建这个数据库,我们可以更直观地了解数据库、表、记录、字段、索引的概念,以及它们相互间的关系。有兴趣的朋友不妨再在库中添加一个歌手档案数据库,学习关系数据库中多数据表之间是怎样关联起来的。
创建ODBC数据源和使用数据库别名
接下来我们要为数据库创建一个ODBC数据源。什么是ODBC?它的全称是开放式数据库互联(Open Database Connectivity),这是一个数据库的访问标准。由于不同的数据库在存储结构、检索算法上存在着很大的差异,为了使应用程序能够通过统一、通用的方法访问不同的数据库,微软提出了ODBC数据库访问标准。目前几乎所有的数据库管理系统都支持ODBC标准。CBuilder的BDE也具有ODBC接口,可以在CBuilder下访问支持ODBC的数据库。
数据源是ODBC标准中的一个概念,它把一个具体的数据库定义成为一个数据源,数据源中指定了数据库的类型、所使用的驱动程序、所处的路径等信息。应用程序在访问数据库时,只需要和数据源建立联接,而不用考虑数据库所处的具体位置。这样,即使数据库所在的位置(如移到另一个目录中)发生了变化,我们只需要重新设置数据源,而不需要改变应用程序中的代码。
ODBC数据源由操作系统进行创建和管理。我们打开Windows的控制面板中,找到并运行其中的ODBC数据源工具,就会出现如图14-1所示的ODBC数据源管理器,其中有用户数据源、文件数图14-1:ODBC数据源管理器
据源、系统数据源等多个选项。我们在用户数据源选项页中单击“添加”按钮,弹出创建新数据源对话框,在其中选择数据源的驱动程序为Microsoft
Access Driver(*.mdb),然后按下完成按钮。
接下来,系统会调用Access2000的ODBC数据源安装对话框,如图14-2所示。在其中输入数据源的名称MP3CollectDSN,并通过“选择”按钮选择数据库“”,设置完成后,按下“确定”按钮,新的数据源MP3CollectDSN就创建好了。
下面还要为数据库创建和配置图14-2:Access数据源安装对话框
据库别名。前面提到过,别名是BDE引入的重要概念。在CBuilder的数据库访问元件中,很多元件都需要指定一个数据库的名称,这个名称通常就是数据库别名。别名的作用和ODBC数据源的作用很类似,它也定义了数据库的一些连接属性,如数据库类型、路径、连接参数等等。基于BDE的数据库应用程序可以通过简单地指定数据库的别名,就可以和数据库建立起连接。
创建别名可以通过BDE管理器来完成。在Windows的控制面板中找到并打开BDE管理器,如图14-3所示。管理器的左边是Database选项页和Configuration选项页,前者用于创建和维护BDE数据库别名,后者用于配置BDE驱动程序。在Database选项页中,我们看到,数据源MP3CollectDSN也位于其中,说明ODBC数据源同样可以作为BDE数据库别名来使用。不过为了说明别名的使用方法,心铃决定创建一个新的别名MP3Collect。
在Database选项页中调出关联菜单,在其中选择“”菜单命令,在弹出的“New Database Alias”中选择数据库驱图14-3:BDE管理器
动程序名称为“Microsoft Access
Driver(*.mdb)”,然后确定。这时Database
选项页中多了一项别名,我们将其名称改为MP3Collect。BDE管理器的右边显示了新别名的定义,在其中的ODBC DSN栏中输入MP3CollectDSN,其它的项目采用缺省配置,然后选择菜单命令“Object->Apply”保存数据库别名MP3Collect的设置,为了验证别名设置是否正确,还可以选择菜单命令“Object->Open”来打开MP3Collect,如果打开正确,则说明别名设置是正确的,以后就可以在CBuilder应用程序中使用别名MP3Collect了。最后,用菜单命令“Object->Close”关闭打开的数据库别名。
MP3Collect的窗体设计
完成上面的准备工作之后,我们就可以开始设计新的MP3Collect了。首先在CBuilder中新建一个工程(也可在原有工程上改,不过最好要做一个备份),工程名称仍然采用MP3Collect。工程中的主窗体名称为MainForm,主窗体类名称为TMainForm。
新的窗体和第一版的窗体具有同样的界面风格。其中,窗体的上半部分与第一版完全一样,有三个编辑框edtFileName、edtSongName和edtSingerName,用于输入记录信息和查询条件,有七个命令按钮btnFilename、btnAdd、btnModify、btnDelete、btnFind、btnShowAll和btnExit,一个循环播放选项框chkLoop,以及一个媒体播放器控件MediaPlayer1。其余的非可视元件如Timer1、OpenDialog1和PopupMenu1等也与第一版中完全一样。
窗体中的记录显示控件由原来的ListView1改为数据库控制元件DBGrid1。并新添了数据库控件Database1(VCL类为TDatabase)、数据表控件Table1(VCL类为TTable1)、数据查询控件Query1(VCL类为TQuery)和数据源控件DataSource1(VCL类为TDataSource)。
放置好各种元件之后,还要设置元件的属性。这里只介绍新添的几个数据库控件的属性,其余的与第一版中的一样。
首先设置数据库控件Database1,该控件代表了应用程序与某个数据库的连接,使程序获得对整个数据库的访问权。设置其Database Name属性为MP3Collect,指定其连接的数据库为BDE别名MP3Collect,由于别名中已经定义了连接的各种参数,所以Database1的DriveName、AliasName等属性均不需要进行设置。另外设置其LoginPromote属性设为false,表示连接时不要弹出登录对话框,登录对话框是用于在与数据库建立连接时提示用户输入用户名和口令的,在本例中并没有为数据库设置口令,所以不需要它。最后,将Database1的Connected属性设为真,表示与数据库建立起连接。
接下来设置数据表控件Table1。该控件是最基本的数据库访问控件,它代表了实际的数据表对象,其中封装了对数据表的操作,如创建数据表,定义字段、索引,以及添加、修改、删除记录等。我们的程序中使用该控件主要是用于添加、修改和删除记录等操作。选中Table1控件后,可以在对象监视器看到它的属性非常多,其中大部分都可以采用缺省值,需要设置的有以下三个:在DatabaseName属性中,点击右侧的下拉式列表框,选择别名MP3Collect;在TableName属性栏中选择数据表MP3Info,并在其IndexName属性中选取索引ID;设置Active属性为true。至于其它属性,请有兴趣学习数据库开发的朋友参考相关资料。
由于篇幅所限,其余几个数据库控件的属性设置,以及功能代码的实现就留到下一讲中。本讲的内容涉及到数据库的许多概念,初次接触的朋友可能会感到比较难懂和枯燥,建议感兴趣的朋友们多结合实例,充分理解这些概念。
名词解释:
数据表:一组相关数据的集合,类似于表格,它的每一行称为一条记录,每一列称为一个字段。在关系数据库中,数据表是真正存储数据的地方。
记录:在数据库中,记录是一个专有名词,它是数据表的单一入口,每条记录由几个字段组成。
字段:记录中一个特定的数据项目,数据表中的每一列定义了字段的数据类型和数据宽度等属性。
索引:数据库中为加快对某一字段的查询而保存的特殊信息。
记录集:应用程序访问数据库时获得的一组数据集合,它可以是一个表中的全部数据,也可以是表的一个子集,或是几个表的合集。
BDE:Borland公司开发的数据库引擎,是Delphi以及CBuilder应用程序访问数据的核心。
数据源:数据源是ODBC标准中的一个概念,它为某一个具体的数据库指定一个名称,数据源中定义了数据库的类型、所使用的驱动程序、所处的路径等信息。
别名:别名用于基于BDE的数据库应用程序中,它的作用与ODBC数据源很类似。设置和维护数据库别名一般是通过工具软件BDE管理器来完成。