一、引言
编程学苑—Delphi专题讲座从本期开始了,心铃在此先谈谈自己的一些想法。从年初接到责任编辑的约稿之后,心铃一直在琢磨如何写好本次Delphi专题讲座,同时也参考、学习以前几位心铃的专题讲座的风格。从专题的选择来说,心铃最终选择了“数据库”这个专题,一是心铃业余时间主要是写数据库程序的,写数据库专题比较熟悉;二是数据库的应用是目前最广泛的,据统计约60%以上的应用软件都是与数据库有关的。心铃希望这次Delphi数据库专题讲座能起到抛砖引玉的作用,使得读者能通过本次讲座学习到如何编制一个完整的数据库应用程序,并在自己的工作、学习中得到应用。
现在有关Delphi数据库编程的书籍、资料也很多,心铃不想东拼西凑地抄、搬一些资料来胡弄读者,不想按照它们的如先讲数据库组件最后以一个例子来结束等风格来写本次讲座,也不能面面俱到地讲解每个数据库组件的属性、方法和事件,因为这些知识大部分都是重复帮助文件的内容,再者有些讲了也没多大用途,读者可根据需要随时从帮助文件中获取,心铃不想浪费宝贵的版面。本次讲座将以一个稍微复杂一点的数据库应用程序为主线,将用到的数据库组件及有关知识穿插讲解,尽量做到覆盖面广一些,同时在讲座中间可能插入一些小例子或技巧来讲解一些组件重要的属性、事件和方法等。所以,如果您习惯了一些书籍的编写风格,可能会感到本次讲座在组织形式上有点乱,但如果您能跟着讲座坚持学习,相信您会有所收获。
本次讲座计划涉及的主要内容是:以本地数据库为主,介绍通过BDE存取数据库;通过ODBC、ADO操作数据库;SQL在数据库中的应用;数据库程序的安装制做;如果时间、版面允许会介绍一下SQL SERVER。这只是一个计划,将根据读者反馈意见、编辑要求、时间或版面的情况进行适当调整。本讲座以目前使用广泛的Delphi 5.0企业版为编程环境,虽然Delphi6.0已发行,心铃的电脑中也安装了,但可能目前用的读者还不是太多,如果您用的是6.0版或4.0版,应该都是可以的,只不过有些数据库组件所在组件面板的位置不一样。顺便说一下,写本次讲座的心铃只是一个业余Delphi爱好者,非专职程序员,对Delphi的学习不是面面面俱到,对比较熟悉的内容也达不到非常精通的水平,所以本讲座不适合高水平的读者,适于初级和中级水平的读者阅读,在讲座中可能会有一些错误之处,希望广大读者能及时指出,心铃在得到提高的同时也能使其他读者得到正确的信息。
心铃尽量将一些关键之处讲解详细,使读者能理解和明白,希望读者能及时提出建议、意见,将本次讲座办好,不辜负编辑的信任和读者的期望。心铃信箱:xinling@sweek.com,随时准备接受您的意见、建议或其他问题。阅读本讲座的读者应已具备数据库的基本知识,如数据表、字段、字段类型、索引等概念,对delphi本身应该具备初级水平。
下面心铃先谈谈如何写一个数据库程序。
二、如何写一个数据库程序
心铃非计算机专业科班出身,没学过软件工程等之类的课程,这里只能从经验来谈谈如何编写一个数据库程序。当然这里的有些经验也适用写其他的程序。
第一、首先应做一个方案。也可以说是一个计划、大纲之类的东西吧,在方案中首先要根据自己或客户的的需要把主要应具备的功能写清除、写详细,这是很最关键的,否则在设计完成后发现有些功能由于事先没有考虑周到再重新设计将会很麻烦的,可能有些需增加的功能容易补充,而有些可能由于没有留下接口等等会造成将原来的代码要做大量修改。其次,列出需要的辅助功能和其他一些通用功能。比如,对电脑和数据库不熟悉的客户一般不会提出数据库压缩、整理之类的功能,但我们在程序设计中应该考虑这些功能,还有如数据库备份、恢复功能等;通用的一些功能如帮助文件、关于本程序等等,这些一般是任何软件都应该有的。最后,将数据库结构构建出来。根据需要完成的功能,选择什么样的数据库,数据库应有几个数据表,每个数据表应该具备多少字段,字段的类型、长度、是否允许空值,是否建立索引等都要写清除。
第二、设计初步程序流程。根据要完成的功能,将大致的程序流程写出来,每个功能都要写出基本流程,主要是为以后的程序编写起到一个指导作用,当然,在实际写程序的过程中可能会有很多改动,但一个基本的流程会指导你在写程序时不会出现大的偏差。
第三、准备所需资料。这里主要指的是编程所需资料,根据方案需要完成的功能分析可能需要哪些方面的资料,对非专职程序员来说,有些资料是不太可能记的非常牢,在写程序时经常需要参考一些资料或以前编写的程序代码,把这些都找来,放在一个专用文件夹中(电子版)或放在案头(纸介质类),以便于在需要时能及时查阅。当然,如果客户提供的资料需要在编程中使用,当然更要准备好。另外,要考虑是否有一些功能单靠编程软件自身不好完成需要使用第三方组件或其他辅助工具,如果需要把这些组件和工具也准备好。
第四、设计初步界面。根据要完成的功能,在纸上设计一个大致的界面,考虑可能用到的菜单、工具栏、状态条,采用独立的窗口还是MID窗口介面等,这里无需很细致的界面,因为在实际写程序中介面常常根据需要进行调整,这里只是设计一个轮廓。
第五、分析难点及解决方案。即使对一个编程高手来说,写一个程序也会碰到一些比较困难之处。为了能比较顺利完成程序设计,最好根据所需功能和程序流程来对整个程序框架分析一下,根据自己掌握的知识、技能来找出某些困难之处,并找到解决方法。比如,对于比较复杂的查询,可能用一条SQL语句查询得不到所需结果,你就需要分析一下如何能完成这个功能,是否采用临时数据表来实现,如果需要使用临时数据表,那么如何将数据导出到临时表中,这样的SQL语句如果还不会写,那么马上查查资料看看如何实现,最好找一个临时数据库来写几句代码验证一下看能否解决,如果解决了,可将代码作为资料保存备用。这样通过分析,将所有可能成为难点之处都找出来并找到了解决方法后,在以后程序的编写过程中虽然可能达不到一气呵成的程度,也应该比较顺利,总比在编程中碰到一个难点好几天都无法解决而停下来要好吧!心铃喜欢写程序时能一口气完成一个功能,这样思路流畅,写起来效率高,如果中间老是间断就没有心情了。当然这只是心铃的习惯做法,可能有的读者并不喜欢这种风格。
第六、开始写程序。在上面的准备工作做完之后,应该说,到这里万里长征已走完了三分之一,或者说走完了一半都不夸张。因为有了明确的程序流程、有了基本充足的资料、可能碰到的难点都找到了解决方案,我们还怕什么呢?由于事先准备的比较充分,即使以后程序的编写过程中可能还会碰到一些困难之处,但毕竟不会出现很多拦路虎了,我们需要的就是拿出一大块时间,静下心来认真按照方案和流程来写程序了。这里说明一点,在写程序之前应该首先建立空白数据库,当然可以在设计方案时同时建立数据库,也可以在完成前面的五步之后在正式写程序前建立空白数据库。
写程序的几点建议:由于数据库程序和用户的交互功能较多,用户需要输入的数据很多,所以必须充分考程序的错误处理,对用户可能出现的输入错误要充分考虑并在程序中尽量及时给出提示,在保存时对输入数据进行校验,防止一些非法数据保存到数据库中,导致以后的统计、查询出现错误。程序要写的非常健壮是很不容易的,从心铃写数据库程序的经验来看,很大一部分精力都用在防止出错、使得程序能健壮运行方面。一般在完成一个功能的代码编写后立即进行调试,通过后再编写另外一个功能的代码,这样可防止代码都编写完毕再调试可能带来的相互影响而弄不清除到底哪部分代码有问题。代码中关键的地方要加些注释,以防以后自己都看不懂当初是怎么写的了。将程序代码做好备份,免得万一来一次灾难而痛心疾首为什么没及时备份代码。
关于如何写一个数据库程序就先谈这么多吧,以后在讲座中还会结合例子讲一些,这里是仅供参考的几点建议。
三、Delphi是如何操作数据库的?
我们先来简单了解一下Delphi是如何存取数据库的。Delphi操作数据库主要是利用BDE(数据库引擎)来进行,当然通过其他方式绕过BDE直接访问数据库在Delphi中也都可以实现,不过,对于本地数据库来说,通过BDE存取数据效率还是很高的。本地数据库如果能熟练操作的话,编写网络数据库也很容易上手了,对普通读者来说,写网络数据库的机会还是不如单机本地数据库多,所以,本次讲座的重点还是以本地数据库为主。
BDE是Borland Database Engine的缩写,它是负责用户和数据库打交道的中间媒介。事实上,应用程序是通过数据访问组件和BDE连接,再由BDE去访问数据库来完成对数据库的操作的,并非直接操作BDE。这样用户只需关心数据组件即可,不用去直接和BDE打交道。数据库组件主要有数据访问组件和数据控制组件,它们和数据库的关系可用下面的示意图来表示:
用户←→数据控制组件←→数据访问组件←→BDE←→数据库
通过BDE几乎可以操作目前所有类型的数据库。我们来简单了解一下常用的数据库组件。
(一)数据访问组件(Data Access Component)
数据访问组件在组件面板的Data Access组件页上,在这里我们简单介绍一下,Table、Query和Storedproc三个组件也称为数据集组件,用于和数据库连接,读者可将这些组件视为数据库,对它们的操作就可认为是对数据库的操作。
DataSource组件是数据集组件和数据控制组件的连接媒介。数据控制组件是用户操作数据库中数据的界面,只有通过DataSource才能和数据集组件连接,从而获得数据用来进行显示、修改等操作。
Table组件是通过数据库引擎BDE来存取数据库中的数据的,并通过BDE将用户对数据库的操作如添加、删除、修改等传递回数据库,这是非常重要的一个组件。
Query组件是利用结构化查询语言(Structured Query Language)通过 BDE来操作数据库的,和Table组件完成的功能基本一样,只是采用了SQL来实现,是重要的组件之一 。
Storedproc组件是通过 BDE对服务器数据库进行操作的,常用于客户/服务器结构的数据库应用程序。
DataBase组件一般用于建立远程的数据库服务器--客户/服务器结构的数据库应用程序和数据库之间的连接。
Session组件是用于控制数据库应用程序和数据库连接的,主要用于复杂的功能,比如多线程数据库程序编程。
BatchMove组件 用于大批数据的转移、复制等。
UpdateSQL组件专用于只读数据库,用于缓存数据库的更新。
NestedTable组件通过BDE操作嵌套数据库(一个数据库作为一个字段保存在另一个数据库中),和Table组件类似,心铃没用过嵌套数据库,所以对此组件没有任何使用经验。
(二)数据控制组件(Data Control Component)
数据控制组件也可称为数据显示组件或数据浏览组件。它们的主要功能是和数据访问组件配合供用户对数据进行浏览、编辑等操作。数据控制组件在组件板上的DataControl页上,共有15个组件。它们分别是: DBGrid组件、DBNavigator组件、DBText组件、DBEdit组件、DBMemo组件、DBImage组件、DBListbox组件、DBComboBox组件、DBCheckBox组件、DBRadioGroup组件、DBLookupListBox组件、DBLookupComboBox组件、DBRichEdit组件、DBCtrlGrid组件、DBChart组件。这些组件使用起来都不复杂,有几个稍复杂一点的以后将会讲解。这里就不再逐个解释了。
另外还有一些组件与数据库有关。Decision Cube是一组主要用于统计的组件,可以表格或图形等直观的方式表达统计结果,不过,似乎应用的不是很广泛。QReport 组件是用来最后输出报表的组件,从很多用户的反应情况来看,此组件不太适合中国人报表的习惯,此组件是Borland从别的公司购买的,性能上不是太好,所以现在用的不是太多,另有一些第三提供的报表组件很好用,也有一些国人做的报表组件,很适合中国人的习惯,所以如果最后版面允许的话,将简单介绍一下这些组件的使用。
还有一个组件页是ADO(ActiveX Data Objects),主要是使用微软的 OLE DB 功能对在数据库服务器中的数据进行访问和操作。其主要优点是易于使用、高速度、低内存支出和占用磁盘空间较少。ADO 支持用于建立基于客户端/服务器和 Web 的应用程序的主要功能。ADO 同时具有远程数据服务 (RDS) 功能,通过 RDS 可以在一次往返过程中实现将数据从服务器移动到客户端应用程序或 Web 页、在客户端对数据进行处理然后将更新结果返回服务器的操作。ADO现在逐渐流行起来,ADO本身也是很复杂的,微软有专门的帮助文件来解释如何使用ADO,本讲座将会用一些篇幅来讲解一下如何使用ADO来操作数据库。
第一讲就先到这里,在下一讲中将着重介绍一下操作数据必须首先要了解的BDE的有关知识。