导航
  • 主页
  • 招聘
  • 语言基础/算法/系统设计
  • 数据库相关
  • 图形处理/多媒体
  • 网络通信/分布式开发
  • VCL组件开发及应用
  • Windows SDK/API
  • 问答

FAQ:BDE的工作原理和Error $2109

stiwin 2002-10-07 08:48:08
由于人们在借助于Delphi 5中的BDE来开发数据库应用程序时,经常会出现一些莫名其妙的错误,故而导致了BDE的使用越来越受到冷遇,而相应的其它一些变通方法,譬如:利用ADO控件或利用一些第三方所提供的专用控件Diamond,则愈加受到追捧。但作为与Delphi一起绑定分发的BDE毕竟有着其独特的优势,只要我们真正地弄清楚BDE的工作原理,那么它还是能够为我们提供很好的服务的。

  Delphi数据库应用的最大奥秘在于它的独特的数据库引擎BDE(Borland Database Engine),它使我们的程序编写更为方便,移植起来也十方便,可适应从客户/服务器模式到分布式网络计算,如果再充分利用Windows的多线程、COM、CORBA、MTS等机制,将会开发出更为美妙的东西来。Delphi主要是通过数据库引擎BDE来处理数据的。BDE实际上是由几个DLL模块组成的,它们分别负责处理一些数据库的相关工作。所有数据库存取使用的例程,均需要通过BDE来处理。BDE是Delphi数据库功能的枢纽部分,是连接应用程序和数据库的桥梁。Delphi可以通过BDE来控制读取本地数据库,Delphi自带的Xbase和Paradox无须安装,这对于开发原型或小型系统极为有益。对于远端的数据库系统,BDE则通过SQL Links或开放数据连接ODBC Drivers(Open Database Connectivity Driver)来存取数据库的内容。

  BDE的初始化过程

  如果在您的机器上装有其它版本或重复的BDE,那么BDE是按照下列的搜索顺序来载入BDE的DLL文件Idapi32.dll的,具体顺序如下:

  1、搜索当前目录(该目录也许与应用程序的起动目录有所不同);如果没有找到该文件,将继续:

  2、搜索注册表中BDE路径所对应的条目,HKEY_LOCAL_MACHINE/ SOFTWARE/
Borland/Database Engine/ DLLPATH/xxxxx ;如果没有找到该文件,将继续:

  3、按照装载库文件的先后顺序来进行搜索:

1) 搜索应用程序的当前起动目录;如果没有找到该文件,将继续:
2) 搜索System目录;如果没有找到该文件,将继续:
3) 搜索Windows目录;如果没有找到该文件,将继续:
4) 搜索PATH环境参数中所设置的路径。
 
装载驱动程序的DLL文件的先后顺序除了第一步的搜索路径要换为Idapi32.dll这个文件被载入的目录之外,其它基本跟上面一样。

  注:在某种情况下,从应用程序的当前起动目录中载入与BDE相关的DLL文件,是很有用的,因为用这种方法可以防止其它使用BDE的程序也同时运行;如果真的出现这种情况,将会发生初始化失败的错误信息:DBIERR_MULTIPLEIDAPI。

  为DLL文件准备的共享内存装载地址

  BDE预留了某些首选的内存地址以供它的一些DLL文件使用。在大多数情况下,如果DLL文件不能被载入那些首选的内存地址,那么系统将会自动地将它们载入其它内存地址。然而下面的这些DLL文件在所有使用BDE的应用程序中必须被载入特定的首选地址;本地的BDE驱动程序预留了下列地址:

  BDE DLLs 地址:

IDAPI32.DLL 0x4BDE0000
IDPDX32.DLL 0x4CDE0000
IDDBAS32.DLL 0x4DDE0000
IDASCI32.DLL 0x4EDE0000

  如果这些地址已经被其它应用程序所占用了,那么相应的BDE DLL文件就不会被载入,从而产生出错信息;这些出错信息具体如下:

  1、如果相应的地址空间已经被占用,从而导致文件Idapi32.dll不能被载入,那么系统将返回DBIERR_CANTLOADIDAPI这条出错信息。

  2、如果由于某种冲突,从而导致了任何一个共享驱动程序不能被载入,那么将返回带有该驱动程序名称的DBIERR_CANTLOADLIBRARY出错信息。

  SQL驱动程序是不被共享的,故不需要固定的载入地址。
 根据上述两条出错信息的发生机制,我们可以很容易理解下面的这个现象:

  当我们利用InstallShield来制作应用程序的安装盘时,我们已经将所需要的诸如:与应用程序本身有关的文件和与BDE相关的文件,全部打包完毕,并且已确保了相关设置的正确性。然后去那些已经装有BDE的机器上进行该应用程序的安装,经常会碰到这条出错信息:

An error occurred while attempting to initialize the Borland Database Engine (error $2109)。

  产生这条出错信息的主要原因是:由于这台机器上以前由于安装其它程序的需要,已经装有BDE了;而现在如果你的这个应用程序在该台机器上进行安装的时候,它若发现该台机器上已经装有相同版本的BDE,那么它将会默认地不安装本来已经打包好的BDE,而采用该台机器上已经安装好的BDE,从而导致了上述的那个初始化错误。

  为了解决上面那个问题,可以采用下面的两种方法中的一种:

  一、 重新安装该应用程序,并在程序安装的过程中设置”Install BDE”选项处于选中状态。

  二、 手工删除先前已经装好的BDE,然后再重新安装该应用程序。

  至于如何手工删除先前已经装好的BDE,具体可以分为以下三个步骤来进行:

  1、删除BDE目录中的所有文件。大多数情况下,该目录的路径是:C:Program FilesBorlandCommon FilesBDE,一旦BDE目录中的文件全部被删除后,你也可以将该BDE文件夹本身删去。

  2、确保当前控制面板没有被打开,然后从C:WindowsSystem目录中删除BDEADMIN.CPL;这样做的目的是将控制面板中的BDE Administrator图标删除。

  3、使用RegEdit将注册表中BDE的两个注册主键删去:

HKEY_LOCAL_MACHINESOFTWAREBorlandBLW32和
HKEY_LOCAL_MACHINESOFTWAREBorlandDatabase Engine。

  多重初始化和退出机制

  可以在同一进程里多次调用DbiInit,但是每一次对DbiInit的调用都必须有相对应的DbiExit紧随其后。

  错误恢复方法

  当发生一个致命的应用程序错误的时候,建议使用DbiExit来彻底地关掉BDE。

  当发生一个致命的BDE错误的时候,建议关掉所有正在使用BDE的应用程序。
...全文
17 点赞 收藏 1
写回复
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
stiwin 2002-10-07
up
回复
发动态
发帖子
Delphi
创建于2007-08-02

4802

社区成员

Delphi 开发及应用
申请成为版主
社区公告
暂无公告