在Delphi中动态加载ODBC实现数据库访问的方法
2012-12-23崔怡文
崔怡文
(武汉铁路职业技术学院,湖北武汉 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.