数据库编程是Delphi最强大的优势之一
恐怕也很少有Delphi程序员没有接触过数据库编程的
Delphi独特的Data
Aware构件
让很多初识Delphi的人为之目瞪口呆
不需要写任何代码
在几分钟之内就可以做出一个相当精巧的数据库程序
而且在开发期就可以看到运行期的结果
这真是不可思议啊!但是
Delphi强大无比的数据库开发能力
决不仅仅限于用几个构件操纵一下DBF或是Access数据库而已
你所看到只是冰山一角
让我们仔细说来
数据库虽然家族庞大但一般来说可以分为两种文件型数据库和C/S型数据库下面分别讨论
文件型数据库
所谓文件型数据库顾名思义是基于文件的(filebased)数据被按照一定格式储存在磁盘里使用时由应用程序通过相应的驱动程序甚至直接对数据文件进行读取也就是说这种数据库的访问方式是被动式的只要了解其文件格式任何程序都可以直接读取这样就使得它的安全性相当糟糕同时在蓬勃兴起的网络应用文件型数据库更是难有用武之地效率低下不支持很多SQL命令不支持视图触发器存储过程等高级功能等等这些特点决定了它不适合大型的工程
最为大家所熟悉的文件型数据库可能就是DBF(DBase/Foxbase/Foxpro)数据库在DOS时代风靡一时相信很多人都有过抱着一本手册苦背Foxbase命令的回忆吧!其特点是每个Table或Index都是一个独立的文件使用相当简单性能还可以安全性非常的差但应用非常广泛(主要是DOS时代遗留下来的哪个单位没有两个用这种东东编出来的老古董程序呢?)它在今天还能占有一席之地其主要原因之一是正因为简单和使用广泛使得对它的访问是最容易的甚至根本无需第三方的接口就可直接对其进行字节级的读取
除此之外还有着名的Access数据库这是MSOffice里的构件之一和DBF数据库不同所有的文件都被整合在一个mdb文件中这样就避免了数据库变大之后管理上带来的麻烦同时它还提供密码保护功能安全性比DBF数据库要好很多Access数据库除了一般的文本数据之外还擅长于对多媒体数据的处理在对声音图像乃至基于OLE的对象进行处理时令DBF数据库望尘莫及随着微软战略的步步胜利Access数据库也不断发展凭借着优秀的性能和与MS Office的无缝结合早已超越DBase系列成为现今最强大的文件型数据库了
Delphi中附带的Paradox也是一种文件型数据库它是Inprise公司自己的产品因此和Inprise的系列开发工具配合得很不错它支持密码保护支持标准的SQL性能也还不错但是应用就不那么广泛了和DBF数据库一样它的每一个Table都是一个独立的文件因此也有同样的管理问题
上文说到可以对文件型数据库直接读取但实际编程中很少有人这么做因为再简单的数据库其实也是相当复杂的一步步分析它的格式从底层实现所有的数据库应用如果都要程序员去写的话可能会把人累死所以数据库的开发商将这些访问代码封装起来向程序员开放程序员只需要调用相应的接口就可以了
以DBF为例使用DBase/Foxbase/Foxpro系列开发工具可以用它自己的语法开发出应用程序其中对DBF文件的具体操作被封装了对于Access数据库微软公布了一个DAO(DatabaseAccessObject)由一系列的DLL文件组成封装了对mdb文件的访问使用VB的读者可能对DAO比较熟悉只要在VB中嵌入DAO对象就可以非常方便地访问Access数据库了ODBC(OpenDataBaseConnection开放数据库互连)也是一种封装用意在于向开发人员提供一个统一的接口通过这个接口可以访问任何支持ODBC的数据库只要该数据库提供了相应的ODBC驱动从这一点上来说ODBC是一种更加高级的封装目前几乎所有的主流的数据库都能被ODBC所支持打开你的Windows的控制面板就可以看到ODBC的图标
用Delphi写数据库程序的人免不了要同BDE打交道BDE(Borland Dasebase EngineBorland数据库引擎)是一个和ODBC类似的东西orland/Inprise本来企图用它来统一数据库接口但后来Inprise在和微软的战争中败下阵来(ODBC是微软搞出来的)它又不肯放弃BDE而是将其捆绑在lphi/C++Builder系列开发工具中结果好象变成这些开发工具的一种附属品了
用BDE开发数据库程序相当容易许多Delphi教科书在写到数据库开发这一章时总是告诉你先在BDE中为某个DBF或Paradox数据库设置一个别名然后往窗体上放一个TTable构件然后将其DatabaseName指向相应的别名……然后这个数据库中某个表的内容就在相应的DataAware构件中显示出来了但是它们具体是怎么工作的呢?
Delphi对数据库进行访问时事实上通过了很多层次的连接
DataAware构件DataSource构件DataSet构件BDE数据库
从上面结构可以看出BDE负责与具体的数据库打交道而Dataset构件与BDE相连DataSource构件与Dataset构件相连最后才连接到显示具体数据的DataAware构件在Delphi的构件面板上Data Access页面中的构件一般属于DataSet构件例如TTableTQuery只要指定它们的DatabaseName属性就可以将它们与某个数据库建立连接在DataControl页面中的构件一般是DataAware构件例如TDBGridTDBEditTDBImage它们的作用看上去与一般的Delphi构件相似不同之处在于可以通过一个DataSource构件作为中介与DataSet构件相连并自动显示相应的数据
用Delphi的数据库构件建立一个应用程序是如此之方便但是如果深入下去会发现事情并不简单你可以尝试自己编写代码访问数据库中字段而不是通过DataAware构件由用户来编辑如何做到这一点呢?秘密在于Field构件
可以说Field构件是Delphi数据库应用程序的基础当打开一个DataSet构件时相应的数据会被读取并储存在TTable或TQuery构件的Fields属性中这个属性被定义为Field数组通过直接访问数组可以使用它们例如
TableFields[]AsInteger;
这段代码访问了Table中当前记录的第一个字段该字段的类型为Integer
也可以通过使用FieldbyName属性来使用它们
TableFieldbyName(Last Name)AsString;
[] []