在Delphi中动态加载ODBC实现数据库访问的方法

2012-12-23 04:50崔怡文
武汉船舶职业技术学院学报 2012年2期
关键词:注册表管理器驱动程序

崔怡文

(武汉铁路职业技术学院,湖北武汉 430205)

ODBC(Open Database Connectivity,开放数据库互连)是Microsoft提供的数据库访问接口标准,它定义了访问数据库的API(Application Programming Interface,应用程序编程接口)一个规范,独立于具体的编程语言,用户以统一的方式(即SQL语言)访问不同厂商的DBMS。一个基于ODBC 的应用程序对数据库的操作不依赖于任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC 驱动程序完成。

Delphi作为Windows平台上一个功能强大、面向对象的、可视化的快速应用程序开发工具(Rapid Application Development,简称RAD),是目前最流行的C/S(Client/Server,客户机/服务器)数据库开发的主流工具之一,适用于多种数据库结构。在用Delphi构建的数据库应用系统中,通常使用ODBC接口访问数据库,而ODBC 数据源则通过ODBC 数据源管理器手工添加。分发数据库应用系统时,若让用户自己手动添加ODBC数据源是不可行的,这样显得既麻烦又不符合专业软件的要求,因此在数据库应用程序中让程序自动完成配置ODBC 数据源是专业软件的要求。文中以Delphi为开发环境,介绍在应用程序中动态加载ODBC用户数据源的方法。

1 ODBC数据库访问结构及其Del phi实现要点

1.1 ODBC 数据库访问结构

通过ODBC 访问数据库的体系结构由应用程序、ODBC驱动程序管理器、驱动程序和数据源4部分组成,如图1所示[1]

图1 ODBC数据库访问结构

ODBC是通过使用驱动程序(Driver)来实现应用程序对数据库的独立性的。各个模块的功能分别是[2]:

(1)ODBC应用程序通过调用ODBC 函数向数据库提交SQL语句并处理返回结果;

(2)ODBC驱动程序管理器负责管理和装载特定的驱动程序、管理应用程序和驱动程序之间的通讯,并根据应用程序加载或卸载驱动程序,?处理ODBC 函数调用,获把它们传送到驱动程序;

(3)ODBC驱动程序负责处理ODBC 函数调用,将SQL语句提交到特定的数据源,并返回结果给应用程序;

1.2 ODBC数据源

Windows中的ODBC数据源有三种,分别是用户DSN、系统DSN 和文件DSN。图2是手动配置ODBC数据源的窗口。手动配置ODBC 数据源实际上是将数据源的相关信息写入注册表中,应用程序读取注册表中的相关信息达到访问数据源的目的。因此,我们只要将与手动配置相似的注册表信息写入注册表,就可实现ODBC 数据源的动态配置。

图2 配置ODBC数据源

Windows注册表中与ODBC 相关的键主要有下面几项:

HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers:记录所有已安装的ODBC驱动程序。

HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI:记录已安装ODBC 驱动程序的相关信息。

HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources:记录各系统数据源的类型。

HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI:记录各系统数据源的详细信息。

HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Source:记录各用户数据源的类型。

HKEY_CURRENT_USER\Software\ODBC\ODBC.INI:记录各种用户数据源的详细信息。

配置用户DSN 时,系统在注册表HKEY_CURRENT _USER\Software\ODBC\ODBC.INI目录下建立了对应的用户字符串名称和数值;配置系统DSN 时,系统在注册表HKEY_LOCAL_MACHINE\Soft ware\ODBC\ODBC.INI目录下建立了对应的系统字符串名称和数值;配置文件DSN 时,系统在C:\Program Files\Common Files\OD BC\Data Sources\目录下建立了以DSN 为后缀的文件。通常用户一般进行前面两项DSN 的配置。

2 Delphi中动态加载ODBC的方法

通过ODBC 接口访问数据库的关键是配置ODBC数据源,即设置DSN。DSN 设置有三种实现方法[3]:手工配置、通过专业的应用程序安装制作工具及应用程序实现对ODBC 的自动配置。上述三种方法的原理都是通过修改注册表来实现配置数据源的目的。文中讨论第3种方法即用程序实现对ODBC自动配置的方法。

Delphi中通过程序使用下述两种方法实现ODBC自动配置:

(1)修改注册表

(2)利用DLL

文中实例数据库为Sybase SQL Anywhere 11;数据库名:c:\temp|xy.db;密码(password):xy19661106;用户名(UserID):DBA;数据源名:mysql。

2.1 修改注册表

DelPhi为程序员提供了一个Tregistry 类,它提供了众多丰富的方法来完成对注册表的修改。

(1)OpenKey(const Key:String;CanCreate:Boolean):Boolean

功能:设置当前键,由Key 指定。如果Key为空,则当前键为RootKey的值;CanCreate指定当Key不存在时,是否创建,值为True时创建,为False时不创建。当打开或创建成功时,返回True。

(2) WriteString(const Name:String:const Value:String)

功能:在当前键下,把字符串赋值于一个数据键。

Delphi中通过修改注册表完成ODBC 数据源的配置代码:

procedure TForm1.FormCreate(Sender:TObject);

var regTemp:Tregistry;

ini:TregIniFile;

ComputerName:array[0..MAX_COMPUTERNAME_LENGTH+1]of char;

Size:Cardinal;

Result:String;

begin

result:=';

Size := MAX _COMPUTERNAME _LENGTH+1;

GetComputerName(ComputerName,Size);

Result:=StrPas(ComputerName);//获取计算机名称

ini:=TregIniFile.Create(');

ini.RootKey:=HKEY _LOCAL_MACHINE;//设置根键

str:=ini.ReadString('Software\ODBC\ODBCINST.ini\SQL Anywhere 11','Driver',');//读取驱动数据库的dll及路径

if str='then

begin

showmessage('没有安装Sybase数据库');

ini.Free;;

end

else

begin

ini.RootKey:=HKEY_CURRENT_USER;

ini.WriteString('Software\ODBC\ODBC.INI\ODBC Data Sources','mysql','SQL Anywhere 11');//创建数据源名

regTemp:=Tregistry.Create;

with regTemp do

begin

RootKey:=HKEY_CURRENT_USER;

if openkey('Software\ODBC\ODBC.INI\mysql',true)then

begin

WriteString('AutoStop','YES');

WriteString('CommLinks','SharedMemory,TCPIP{192.168.1.1}');

WriteString('DatabaseFile','c:\temp\xy.db');

writeString('Driver',str);

WriteString('password','xy19661106');

WriteString('ServerName',Result);

WriteString('UserID','DBA');

end

else

begin

showmessage('创建数据源失败');

free;

exit;

end;

end;

end;

end;

2.2 利用DLL

Windows系统子目录中的动态链接库odbccp32.dll提供了一个可以动态地增加、修改和删除数据源的函数,该函数在Delphi中可声明如下:

//配置ODBC数据源,成功则返回True

function SQLConfigDataSource(hwndParent:Integer;?fRequest:LongInt;?lpszDriver-String:string;lpszAttributes:string ):Long-Bool;stdcall;external‘ODBCCP32.DLL’;

hwndParent:父窗口Handle,当指定为0 时不会出现对话框,否则会弹出标准的ODBC 配置对话框。

fRequest:命令请求,用来指明要完成的功能,其值可为1~6。意义如下:

(1)增加一个新的用户数据源;

(2)修改(配置)一个已经存在的用户数据源;

(3)删除一个已经存在的用户数据源;

(4)增加一个新的系统数据源;

(5)修改(配置)一个已经存在的系统数据源;

(6)删除一个已经存在的系统数据源;

lpszDriverString:驱动程序名称,就是在ODBC设置中显示的驱动程序名称,如SQL Anywhere 11。

lpszAttributes:DSN 的一些属性,可有多项,各项之间用分号(;)分隔。如:

'DSN=cm;AutoStop=YES;DatabaseFile=c:\temp\xy.db;password=xy19661106;userID=DBA';

在程序中调用该函数就可完成mysql数据源的创建。

3 结 语

上述两种方法都可以实现动态加载各种类型的ODBC数据源。方法一在实现时需要较多的代码,但操作注册表清晰;方法二所需代码虽少,但形成lpszAttributes字符串复杂,随着要求的增加,其代码长度也会相应增加。若将实现ODBC 数据源动态配置的代码设计成一个ActiveX或DLL控件,更方便数据库应用系统的应用。

1 向隅.数据库基础及应用[M].北京:北京邮电大学出版社,2009

2 李永忠,张心歌.在VC++中动态加载ODBC 实现数据库访问方法[J].西北民族大学学报(自然科版),2005,26(57):47~53

3 鞠儒生,乔海泉,黄柯棣.ODBC 数据源动态配置原理及其实现研究[J].计算机仿真,2006,23(7):84~86.

猜你喜欢
注册表管理器驱动程序
启动Windows11任务管理器的几种方法
应急状态启动磁盘管理器
阻止Windows Update更新驱动程序
Windows文件缓冲处理技术概述
计算机硬件设备驱动程序分析
更上一层楼 用好注册表编辑器
注册表的便捷用法
注册表编辑器也玩“失忆”
在Win 7下利用凭据管理器提高访问速度等
学习器揭开注册表面纱