FireBird编程从入门到精通.docx
- 文档编号:6893001
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:20
- 大小:38.27KB
FireBird编程从入门到精通.docx
《FireBird编程从入门到精通.docx》由会员分享,可在线阅读,更多相关《FireBird编程从入门到精通.docx(20页珍藏版)》请在冰豆网上搜索。
FireBird编程从入门到精通
FireBird编程从入门到精通
从来没有过这么一种数据库,能够像InterBase/FireBird一样富有激情。
这是一种完全为程序员准备的数据库,就像瑞士军刀一样小巧、方便、实用。
以往的数据库,不是太大太笨重(例如,Oracle、MSSQL、DB2),就是太简陋,功能不足(例如MySQL)。
而InterBase/FireBird则是在两者之间找到了一个很好的平衡点,笔者不妨称之为“中型数据库”。
随着硬件环境的不断发展,普通的个人电脑的计算能力越来越逼近并不太久以前的大型计算机的能力,这种趋势同时也大大推动了与此相适应的中型数据库的应用。
中型数据库逐渐蚕食大型数据库的市场,这几乎是一个明显的趋势。
随着软硬件条件的不断发展,很多大型数据库的很多极其复杂的特性,今天看来逐渐成为了不必要。
今天的软件用户更加渴求“简单、实用、绿色”。
InterBase/FireBird数据库几乎就是为这个宗旨而量身定制的。
和InterBase/FireBird相当的数据库引擎还有MySQL、PostGreSQL两种数据库。
和后两种数据库相比,InterBase/FireBird数据库有着最为充沛而友好的开发工具,市面上专门用于这两种数据库的建库工具,就不下十来种,几乎每个资深的Delphi/IB/FB开发者都恨不得自己也做一个管理工具。
最为流行的管理开发工具,例如IBExpert,在不断的发展完善下,其功能甚至于早已超过了其他商用大型数据库的企业管理器。
InterBase/FireBird和Delphi、C++Builder两种工具结合非常紧密,因而,在C/S应用开发方面,InterBase/FireBird占有上风,能够开发出最为细腻友好的客户端UI。
InterBase/FireBird数据库目前正在迅速发展,它们所需要的是更多实战应用的考验,其中特别包括了大型Web应用的考验。
在这方面,MySQL相对而言更成熟一些。
但是,随着InterBase/FireBird用户的不断增多,笔者相信,这个只是个时间的问题。
中型数据库中,没有一种数据库提供了InterBase/FireBird所带来的如此完备的内在构架,如此丰富强大的SQL支持,如此简洁的使用、维护方式,以及精华所在的存储过程语言。
相信这些优异的特性总有一天会在业界放出应有的光芒。
InterBase/FireBird数据库是两个分支的合称。
InterBase是Borland/CodeGear公司的数据库产品,而FireBird则是开源组织持续开发的免费开源版本的InterBase。
由于这两种数据库的核心特性几乎完全一样,所以,笔者书中阐述的特性绝大多数都同时适用于两种数据库。
读者可以根据自己的情况需要,在这两种数据库之间进行选择。
在InterBase/FireBird支持者的持续推动下CodeGear和FireBird开发组织都在持续的改进着这两种数据库,所以,在未来还会出现更多的新特性,这些也许会在本书的后续版本中涵盖。
相信本书的读者,也许会经常访问这两种数据库的官方网站,关注它们的发展,甚至于一定程度的参与到数据库引擎的改进中。
目前市面上关于InterBase/FireBird数据库的书籍很早就已经有了,但是这些书籍都是关于这种数据库本身的功能阐述,相当于数据库的中文手册,这些书籍对该数据库的应用开发却论述甚少。
本书的重点则在于针对这种数据库的应用开发上,面向的是实战性,包括和开发工具的结合以及系统的构架,一些应用开发层面的高级技术将被展开论述,这部分也是本书的精华所在,因而,本书的读者应该是具备一定编程经验的开发者。
好,我在这里感谢各方面人士的支持,我们这就开启InterBase/FireBird数据库激情之旅,执行一句:
select‘我们开始使用InterBase/FireBird数据库了!
’
asresultfromRDB$DATABASE
构建高度智能化的关系数据库系统
现代的应用软件系统的用户,越来越希望软件系统更加的易于维护,使用过程透明化,希望软件本身对人的要求更低,尽量少的涉及专业的计算机知识,使计算机操作者能够更加专注于业务本身。
这些,或许就是所说的“软件系统智能化”。
感谢InterBase/FireBird,使这一高度挑战性的目标实现起来并不困难。
由于特定的历史背景,InterBase/FireBird的开发接口比其他数据库公开的更加彻底,再加之InterBase/FireBird数据库的体系结构也非常的简洁透明,所以用InterBase/FireBird构架智能化的系统就来的比较顺利。
构架纯绿色客户端软件
所谓的“绿色软件”,就是指,程序文件拷贝到空白电脑上面,就能直接运行,不必注册ocx文件、不必读写注册表、不必在系统文件夹下面拷贝文件、以及不必做其他特殊的操作。
随着软件风格潮流的返璞归真的趋势,市面上很多的软件产品都以标榜自己为“绿色软件”为荣。
“绿色软件”的标准是有一定道理的,一方面,它不会给操作系统环境带来污染,另一方面,更重要的一点,绿色软件有更好的健壮性和便携性。
例如,如果系统需要在系统文件夹下面放置若干动态库,那么这些动态库就有可能和其他系统的同名动态库产生冲突,或产生不同版本的混淆,因而增加了故障的概率。
Client/Server数据库的绿色化并不是一件容易的事情,因为很多的大型数据库的客户端的安装必须依赖数据库开发商提供的安装程序,完全的不透明。
因此,开发出小巧、绿色的客户端软件一直是商业开发者的一个话题
值得一提的是,在开发语言方面,目前最适合制作绿色软件的,仍然是老牌子的Delphi/C++BuilderforWin32。
我们这里以经典的Delphi7为例来考察绿色数据库软件的制作。
有如往常一样,我们在Delphi中创建好一个应用程序,养成良好的习惯就是,空白程序一上来,先创建后目录结构,把可执行文件输出路径和源代码路径分离开来,同时创建好数据库存放路径,路径之间的相对关系尽量和用户现场一致。
如下图,可执行文件输出路径是Bin目录,而数据库文件存放在DB目录下。
作为最简单的程序,我们直接在主窗体上放置了数据库连接控件,并且在数据库中创建了表,使控件在设计时连向了该数据库,几乎与以前没有什么差别:
编译之后,我们发现Bin目录中多了一个999k的可执行文件,执行起来,和往常一样顺利:
运行这个程序,我们用一个动态库分析工具看看它调用了哪些动态库:
在笔者的WindowsXP中,Delphi7是经过一定改造的绿色版Delphi7,因此笔者的Windows的System32中可以说只有WinXP自己原先的动态库。
从图中可以看到,这个Project1.exe所用到的动态库,除了Windows的系统动态库之外,只有gds32.dll和midas.dll两个dll。
由此看来,Win32的Delphi开发出的程序相当的干净绿色。
在InterBase/FireBird数据库中,其客户端就是一个小小的动态库(gds32.dll或者FBClient.dll),这样,只要把客户端动态库和应用程序文件放到一起即可完成部署。
好的,我们把动态库两个动态库拷贝到Bin目录下,这样不就可以了?
确实,如果按照最低的绿色软件标准来衡量,这样确实已经可以了,至少你的软件拷贝到空白环境中,真的可以运行起来。
然而,作为专业级别的软件开发者,我们要快速的制作脍炙人口的软件作品,那么在知识上的要求就不能仅于此了。
我们要结合Delphi和InterBase/FireBird数据库的特点,总结一套专门开发绿色软件系统的思路来。
幸亏Delphi是开发绿色软件的能手,这使思路总结出来后,相当的清晰。
如果用更加严格的眼光来看,这个小小的范例程序立即就需要一个重要的改进,那就是在单元的Uses中加入一个单元:
MidasLib。
好,笔者做了这件事情,从新编译,看看目标文件,发现竟然多了200K。
这究竟发生了什么?
这是因为MidasLib是Midas.dll的静态库。
把它囊括到可执行文件之中,可执行文件就不必再部署Midas.dll动态库了。
从新分析一下这个可执行文件的动态库调用,发现果然没有了Midas.dll。
Midas.dll对于Delphi程序来说,是一个特殊的动态库,它本身是一个COM库,需要注册。
系统在寻找这样的动态库时,并非完全遵循Path路径,而是先看看注册表记录的路径,如果不存在,则会自动注册Path内能够找到的Midas.dll。
然而,Delphi的每个不同的版本,都会带有不同版本的Midas.dll,这样,机器上所有程序,都引用最后一次安装的Midas.dll,这样,必然造成混乱。
所以,在单元的Uses中加入MidasLib是非常必要的举动,直接让程序免去依赖MidasLib。
可执行文件+gds32.dll才是比较到位的绿色软件。
对于一个有经验的软件设计人员而言,他的头脑中应该很清醒设计中存在哪些影响软件绿色化的因素,以及有一套评测软件绿色程度的标准和流程。
笔者在这里试图做一个详尽的总结:
1、总结系统所用到的VCL控件集列表,列出每个控件的外部依赖性。
一般来说,通常所说的“纯VCL”控件都是彻底绿色的组件,也就是说不必附带任何文件。
但是也有很多VCL控件包需要外带动态库、ocx、甚至驱动程序。
这些都应该在列表中体现。
2、除了VCL对象之外,系统是否用到了DLL或COM库?
这需要对程序本身所用到的东西做一个统计。
若系统需要部署带有ocx后缀的文件,很明显,系统中用了ActiveX。
但是,很多的COM对象库可能是以其他的后缀结尾,例如,dll。
这需要开发者自己分析和整理。
3、明确程序中用到了哪几种数据库,以及针对每种数据库的访问方式。
不同的访问方式有着不同的外部依赖性。
如下表:
数据库引擎
绿色程度
通用引擎
BDE/SQLLinks
红色
通用引擎
DBX
绿色,但需要部署动态库
InterBase/FireBird
IBX
纯绿色
FIBPlus
纯绿色
通用引擎
ADO
对于MS数据库平台:
绿色,但依赖OS的MDAC的版本
对于其他数据库平台需要部署OLEDBProvider
文件数据库
EasyTable
纯绿色
AbsoluteDB
纯绿色
Halcyon
纯绿色
内存表
dxMemData
纯绿色
KbmMemTable
纯绿色
ClientDataSet
纯绿色(需要引用MidasLib)
Oracle
ODAC
纯绿色
4、明确所访问的数据库的客户端部署需要哪些文件。
最容易处理的,就是客户端只要稍许动态库即可的数据库平台,这样的环境可以算成绿色客户端环境。
但很多著名的数据库并不是如此,很可能需要注册COM对象,甚至于必需运行数据库厂商提供的安装盘。
5、软件进入测试环节后,应该用动态库依赖测试工具来分析程序在运行期间加载了哪些动态库。
这一点仍然是非常重要的。
这是对程序运行时依赖性的一种验证。
如果程序“一不小心”调用了某些“不干净”的代码,那么在这个测试环节中即可直接体现出来。
如果没有测试工具,则也可以直接在开发工具的调试状态下,查看程序进程的Modules列表。
6、软件在测试的后期,可以直接在干净的OS上试运转。
目前诸如VMWare之类的虚拟软件非常成熟了,可以借助这种工具来方便软件的测试。
在InterBase/FireBird这个专题开发领域,“绿色”的概念还有着更加深入的内涵,我们下面进行深入一些的讨论。
1、如果我们的系统是面向单机用户,那么我们不妨考虑一下EmbededFireBird。
这是把整个FireBird数据库合并到客户端动态库中的一个版本。
也就是说,整个Server的功能都已经包含在了gds32.dll或者fbclient.dll中,那么程序的运行也就不再依赖于必需安装FireBirdServer或者InterBaseServer。
这样一来,一个可执行文件加上几个动态库,干净利索的构成了一个复杂的单机数据库系统,直接就能运转起来,这是所有单机数据库系统都希望达到的效果。
它完全免去了数据库引擎的安装,真正实现了“便携”的效果。
2、把数据库服务器的安装包含到我们自己的程序中。
这个特性是FireBird数据库所独有的。
FireBird的部署完全免费,并且提供了相应的服务安装的支持文件,这使得数据库的安装可以完全合并到程序本身之中,使数据库服务成为系统的一部分。
可喜的是,FireBirdServer引擎本身也是纯绿色的,这使得全自动安装服务器变得非常轻松,只要运行以下命令即可:
instreginstall–z
instsvcinstall-auto-superserver-guardian–z
instsvcstart
3、gds32.dll可以编译到可执行文件的资源之中,运行时,可以从资源中调用该动态库。
对于IBX而言,这恐怕需要修改IBIntf.pas单元,以及使用第三方的动态库资源加载代码来达到这个效果。
这些笔者已经为大家做好了,相关文件可以在本书的附带光盘中找到。
这个技术给人的第一印象就是比较“酷”,它能够真正的做到,让客户端程序是一个完全独立的可执行文件,客户端除了这个可执行文件以外,不必部署任何其他文件,包括数据库的客户端。
不过,在实际应用中,我们发现很多情况下这未必是一个最好的做法,因为FireBird/InterBase是一个快速发展的数据库平台,如果把客户端动态库合并入可执行文件,那么要升级新版本的引擎出现的时候,恐怕就必需得从新编译程序了。
特别是FireBird,几乎每年都会有数个新的引擎版本,那么对于一些追求完美的人来说,不停的编译程序将是一件痛苦的事情。
但是对于某些场合而言,这个技巧仍是一个非常有用的东西,例如,我们想把数据库的客户端编写在一个ActiveForm中,这样就省去了附带dll的麻烦。
FireBird/InterBase数据库引擎本身就倾向于绿色和免维护,那么我们在开发系统的时候,不妨就朝着这个方向努力,使我们的系统也变得绿色起来。
除了数据库方面的东西以外,第三方控件的选择也是另一方向。
一般而言,选择控件一定要尽量选择“纯VCL”,它不仅代表着绿色,也往往代表着最好的性能和效率。
几乎所有的ActiveX,都能找到相应的VCL替代品。
例如,微软的串口访问控件MSCOMM,可以用免费开源的CPort代替。
笔者曾经开发的基于FireBird的考勤系统就是采用了Cport。
数据库管理维护功能(Administration)模块的开发
对于FireBird/InterBase数据库系统而言,数据库的维护工作是一个非常重要的内容。
它包含了以下几部分:
1、数据库帐号的维护
2、数据库文件的拷贝、复制
3、数据库的备份、压缩
4、数据库的检查诊断
5、创建镜像
6、设定数据库的运行模式、属性参数
对于很多数据库而言,上述任务的完成往往需要数据库管理员在数据库的管理控制台工具中完成,甚至于需要在命令行状态下敲入特定的命令。
对于智能化的系统来说,这些,都应该通过程序的图形化界面来体现。
要达到这个效果,需要我们的程序本身就包含数据库管理模块。
FireBird/InterBase提供了开放的Administration开发接口,使得这一切变得很轻松。
数据库帐号的维护
我们要更改数据库的帐号,需要使用IBX的IBSecurityService控件。
它的使用方法如下:
IBSecurityService1.Params.Values['user_name']:
=‘sysdba’;
IBSecurityService1.Params.Values['password']:
=‘masterkey’;//写入管理员密码
IBSecurityService1.ServerName:
='LocalHost';//写入服务器名称
IBSecurityService1.Active:
=True;
IBSecurityService1.UserName:
=‘ANewName’;//写入被更改或添加的用户名称
IBSecurityService1.Password:
=‘NewPass’;//写入新的密码
IBSecurityService1.ModifyUser;//更改已有帐号
//IBSecurityService1.AddUser;//添加新的帐号
//IBSecurityService1.DeleteUser;//删除帐号
我们可以看到用IBSecurityService控件来增、删、改数据库帐号非常的方便简捷。
上述的代码可以作为一个函数提供在程序的主服务模块中。
但是需要指出的是,一个用户创建好了之后,并不意味着可以直接以该用户登录来使用数据库中的所有对象。
相反,此时的新用户,恐怕无法使用数据库中的任何对象。
这是因为,新创建的用户,必需通过Grant命令来赋予相应的权限。
所以,如果系统是动态创建用户,则往往在上述代码执行后,用IBScript控件来执行一系列的Grant命令。
在很多时候,我们构建系统并不用如此紧密的依赖数据库平台本身的权限机制,毕竟这样的做法在开发上非常繁琐。
我们更加常用的做法则是在固定的系统管理员帐号的基础上,我们自己构架一套帐号机制,把我们的操作员保存在我们的一张表中,通过我们自己的代码来进行权限认证。
这种情况,我们仅需要使用IBSecurityService1.ModifyUser来改变sysdba的密码就够用了。
sysdba密码连同服务器连接串在客户端程序中被加密的保存在一个本地的文件中,这样每次登录的时候,用户只需要输入操作员的帐号,即可登录。
在某些特定的场合,程序可能需要多种不同角色的帐号内部使用,这种情况,便可以充分的运用IBSecurityService空间和grant命令来实现相应的功能模块。
在简单的关系数据库系统中,系统管理员的密码修改功能,可以直接合并到登录框窗体中,这对于很多场合,不失为是一种既方便用户,又方便开发者的一种做法:
数据库文件的拷贝、复制
InterBase/FireBird数据库有着和Access一样的一个特点,那就是数据库是一个单独的文件。
这一点非常有利于制作高度智能化的数据库系统。
因为对某个数据库的拷贝,简单到了只需要拷贝一个文件的地步。
尽管直接复制数据库文件比Gbak工具生成的gbk文件来说体积要大一些,但是它是一种最为直接的备份方式。
对于硬盘空间充沛的系统,这种方式来实现自动备份最为灵活简单。
拷贝硬盘文件的方法,可以是调用API函数(例如CopyFile),也可以直接调用Shell命令。
由于Shell命令有着更好的灵活性和更丰富的功能,所以是一种更加常用的自动维护功能的实现方法。
我们先给出一个函数:
procedureDoCMD(CMD:
string);
var
Buf:
array[0..511]ofchar;
AFileName:
string;
begin
GetSystemDirectory(Buf,SizeOf(Buf));
AFileName:
=Buf;
AFileName:
=AFileName+'\CMD.exe';
ShellExecute(0,'',PChar(AFileName),PChar('/C'+CMD),'',SW_HIDE);
end;
在这个函数的帮助下,我们可以执行任意的DOS命令,包括拷贝文件:
DoCMD('copyc:
\test\db1.gdbd:
\bak\'+DateToStr(Now)+'.gdb');
如果我们希望做更加复杂一些的操作,比如,将数据库文件拷贝到特定目录下压缩,或者启动、终止某些服务程序,我们可以根据特定的命令格式编写批处理文件,然后用DoCMD函数来执行该批处理。
本书列出3个非常有用的命令:
a)iisreset/stop和iisreset/start:
这是启动或停止IIS服务的命令。
如果读者的系统参与了IIS中的Web功能,那么就有可能需要让IIS服务停止或启动。
b)scstop和scstart:
启动或停止某服务程序的命令,需要添加一个参数。
例如,对于停止FireBird服务来说,是scstopFirebirdServerDefaultInstance。
如果我们需要一个服务名称的列表,那么我们可以在命令行中执行以下命令:
scquerytype=service>C:
\log.txt
这样在C:
\就会产生一个log.txt文件,里面列举着每个命令的名称和状态。
c)压缩命令。
目前WinRAR是最为流行的压缩工具,很多开发者希望用这种方式来自动备份数据库文件,那么相应的命令范例如下:
”C:
\ProgramFiles\WinRAR\RAR.exe”aDB.rar“c:
\test\db1.gdb”
不过,WinRAR工具包毕竟不是免费的,这使得系统对这个工具的依赖比较不利。
我们可以推荐更加紧缩的第三方免费开源的7Zip工具,其官方网址为:
http:
//www.7-zip.org/zh-cn/
上述命令对于7zip而言,它和WinRAR的几乎完全一样:
”C:
\ProgramFiles\7-Zip\7z.exe”aDB.rar“c:
\test\db1.gdb”
7Zip无与伦比的压缩比率,全开放的接口,使它能更好的胜任数据库压缩备份的任务,因而能够很好的被数据库备份工具运用。
(当然,还可以避开Shell的方式,在程序中直接使用7Zip的开发包来做压缩模块,但这种方式和7Zip结合太紧密,缺乏灵活性)
通过上述的方法,我们能够非常方便的实现各种文件复制、移动、删除等功能,实现数据库文件的备份。
在InterBase/FireBird为基础的系统中,数据库复制模块往往会是下面的形态
1、在数据库所在的计算机上,开启一个服务程序,该程序按照特定的时间频率,将数据库文件作复制。
这就是定期自动直接备份。
备份的文件,按照时间的次序,循环滚动存放在特定命名规则的目录下,过期的文件将被覆盖。
当然做到按照时间周期来运行某个功能,有两种做法,第一就是在程序中通过Timer来实现;第二种就是把功能做到程序中之后,通过Windows的计划任务来按照特定周期来调用。
2、在应用服务器或WebServer上,包含一个数据库复制模块。
用户在客户端可以根据自己的要求来让系统做出复制动作。
3、在服务期端有一个图形化的管理工具,打开工具可以进行库文件的复制,甚至于管理工具带有光盘刻录的功能,能够把文件直接刻录到光盘上。
数据库的备份、压缩
FireBird/InterBase提供了专门的备份、恢复功能。
和上述直接备份数据库文件不同的是,真正的数据库的备份文件其实是一个“可便携的”(Portable)紧缩的数据文件。
FireBird/InterBase的这个功能和它们提供的gbak命令是相关的。
在比较早期的时候,InterBase比较偏重于Unix操作系统平台,那时候备份InterBase数据库都是用gbak命令:
备份:
gbak.exe-USER"sysdba"-PAS"masterkey"-BDATA.GDBDATA.fbk
恢复:
gbak.exe-USER"sysdba"-PAS"masterkey"-REPDATA.fbkDATA.GDB
现在这一传统功能仍然被保留。
不过我们却并不希望用户到黑黑的命令行中敲入如此晦涩难记的命令,而是我们的程序代替用户做了这件事情。
我们让我们的程序执行上述shell命令,即可达到备份恢复的目地。
FireBird/InterBase数据库的备份
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FireBird 编程 入门 精通