BDE 的一个 BUG

最近在用 BDE 5.01 驱动 ODBC 时发现了一个 BDE 的 BUG ,它可能也存在于 BDE 以前的版本中。

这个 BUG 表现为:在装有 MS-Office 的系统中, 运行 BDE Administrator 或 SQL Explorer 可以看到几个如:Excel Files , MS Access 97 Database (以 Office 97 中文版为例)等的别名,它们是 BDE 自动获取的 ODBC 的 DSN ( Data Source Name 数据源名,相当于别名), 这只要打开“控制面板”中的 ODBC Data Source Administrator 就可以看到它们都在 User DSN 页中(也有的在 System DSN 中,不过不知为什么 File DSN 中的 ODBC 别名不能进入 BDE ,我记得在以前的版本中好像可以的)。 在 SQL Explorer 中这几个别名是打不开的,因为这几 ODBC DSN 还没有指定相应 的数据库文件,理论上说只要给它们指定一个数据库文件就可以访问这些数据库了, 但事实如何呢?

有两种方法指定数据库文件:一种是用 ODBC Data Source Administrator 给相应的 DSN 指定一个数据库文件, BDE 不用 作任何修改就可以像用一般 BDE 别名一样使用这个 ODBC DSN 了,这种方法是可行的, 但这样的话就失去了灵活性(因为没有简便的程序操作的方法,或者是有而我不知道); 另一种方法是不改变 ODBC DSN ,而在对应的 BDE 别名中指定数据库文件, 就是修改别名的 DATABASE NAME 参数,这种方法应该也是正确的,而且 BDE 别名的 参数可以很方便地在 TDatabase 控件中修改,但实际上这种方法会出错!

系统报告 Microsoft ODBC 出错,信息为: "Invalid connection string attribute DATABASE",即:“无效的连接串属性: DATABASE ”。从出错信息上看,问题出在了 BDE 传递给 ODBC 的参数上。 我猜测 BDE 驱动 ODBC 的方法应该是将 BDE 别名的参数相应转换为 ODBC DSN 的参数然后建立 ODBC 连接。如此说来就是 BDE 在参数转换时出现了错误的参数名:“ DATABASE ”,而这个参数一定就是那个要传给 ODBC 的数据库文件名了,即 BDE 别名中的"DATABASE NAME"参数,那正确的参数名应该是什么? 据我写 ASP (其中用 ADO 操纵数据库时也是用 ODBC )的经验, ODBC 的别名中的数据库文件名参数应该是叫:“ DBQ ”。于是我用 Ultra Editor 的十六方式打开 BDE 的 ODBC 驱动程序文件: idodbc32.dll (从文件名上猜应该就是它),在其中查找字符串:"DATABASE=", 果然让我找到了一处,并且只有这一处。备份 idodbc32.dll 后, 将此处的"DATABASE="改为"DBQ=", 注意: 因为长度不同,必须加上 0 (十六进制码,不是 ASCII 码)或用空格填满(两种方法都可以,我试过了), 存盘退出再试着打开那个别名,成功!

看来果然是 BDE 的错,不过人非圣贤,孰能无过呢? 大家可以照我上面的方法修改 idodbc32.dll 文件,不过要提醒一点, 最好先备份,以防万一。如果觉得麻烦,我写了一个补丁程序:BDEPatch。

可以在此下载:32KB

解开后运行 即可补上这个 BUG ,并产生备份文件: idodbc32.bug 。

补充说明: 此问题在下列版本中存在:
1 Delphi 5 企业版,未加补丁,版本号:5.0.5.62 ,相应 idodbc32.dll 的版本号为:5.1.0.4 ;
2 Delphi 5 企业版,加补丁1,版本号:5.0.6.18 ,此补丁未对 BDE 作修改,与未加补丁一样;
3 C++ Builder 5 企业版,版本号:5.0.12.34 ,相应 idodbc32.dll 的版本号为:5.1.1.1
不信你可以自已试一下。

猛禽 Apr.21-2k/May.11-2k