使用COM扩充DELPHI数据库功能
Delphi是一个非常优秀的语言和开发环境,具有编译速度快、面向对象、全面支持Windows API、支持COM和强大的数据库支持,特别是在Delphi 5中增加了对ADO(Microsoft ActiveX Data Objects)的支持,使得Delphi程序员可以彻底摆脱BDE,缩小软件分发的体积。但是Delphi的ADO组件不支持ActiveX Data Objects Extensions for Data Definition Language and Security(ADOX、ADO的扩展,用于创建、修改和删除模式对象,如表格和过程;操作安全对象,可用于维护用户和组,以及授予和撤消对象的权限) 和Jet and Replication Objects(JRO,用于对Jet数据库引擎添加压缩、同步复制等特征),这些功能在开发Access数据库往往比较重要。不过由于ADOX、JRO乃至ADO都是基于COM(Component Object Model,组件对象模型)的,可以调用COM来来实现这些功能。下面我将讨论这方面问题,以此抛砖引玉,和大家共同研究。
一、关于COM的一些基本概念。
COM对象(COM object)是实现某一特殊功能的二进制代码,包括实现功能的一些方法,这些方法通过COM接口(COM interfaces)被访问。但是你不能直接访问COM接口,你可以通过COM类(COM class)来操作COM接口。
二、引用ADOX和JRO。
开发平台或客户端需要安装MDAC 2.1数据库引擎,你可以从微软公司http://www.microsoft.com/data下载,也可以在安装IE5.0中选择定制安装"动态数据绑定"选项。
在Delphi IDE中选择菜单Project\Import Type Library,出现Import Type Library对话框,选择"Microsoft ADO Ext. 2.x for DDL and Security",将Class Name中TTable改为TADOXTable(因为TTable组件在Delphi中已经存在并注册);选择"Microsof Jet and Replication Object 2.x Library"。然后单击"Install"安装,便在Delphi的Imports目录下生成ADOX_TLB.pas和JRO_TLB.pas两个文件。在Unit文件的Uses中加入ComObj、ADOX_TLB、JRO_TLB,就可以通过COM操作ADOX和JRO对象了。
打开ADOX_TLB.Pas文件,可以看到定义的接口有_Catalog、_Table、_Index等。
建立一个接口对象主要有两种方法(以建立_Catalog的对象为例):
首先定义Catalog为接口_Catalog的类型。
方法1.通过CreateComObject函数建立实例
Catalog:=CreateComObject(Class_Catalog) as _Catalog;
方法2.通过类来建立实例
Catalog:=CoCatalog.create;其实两种方法原理是一样的。在Adox_TLB.pas中,CoCatalog是这样定义的:
CoCatalog=class
class function Create:_Catalog;
……
class function CoCatalog.Create:_Catalog;
begin
Result:=CreateComObject(CLASS_Catalog) as _Catalog;
end;
建立了接口对象的实例后,就可以通过接口对象的属性、方法等实现一定的功能。关于ADOX和JRO的对象模型、属性和方法等,请读者自己参阅MDAC SDK或Access2000中的帮助文件,这里就不在重复了。
三、使用ADOX和JRO的例子。
建立一个工程项目,在Form1Uses中加入ComObj、ADOX_TLB、JRO_TLB,添加三个按钮:btnCreateDB和btnCompactDB,用于实现创建数据库、创建数据表和压缩数据库功能。
1.创建数据库、数据表和索引。
procedure TForm1.btnCreateDBClick(Sender: TObject);
var
Catalog: _Catalog;
Table: _Table;
Index: _Index;
strCon: string;
begin
Catalog := CreateComObject(Class- Catalog) as _Catalog;
strCon := 'Provider=Microsoft.Jet.OleDB.4.0;'
+ 'Data Source=d:\ComTest\myDb.mdb;'
+ 'Jet OLEDB:Engine Type=5;'
+ 'Locale Identifier=0x0804;'
+ 'Jet OLEDB:Database Password=mypwd';
Catalog.Create(strCon);
Catalog._Set_ActiveConnection(strCon);
with Catalog do
begin
Table := Create Com Object(Class- Table) as _Table;
with Table do
begin
Name := 'Tel';
Columns.Append('Name', adVarWChar, 8);
Columns.Append('Phone', adVarWChar, 20);
Index := CreateComObject(Class_Index) as _Index;
with Index do
begin
Name := 'MyIndex';
Columns.Append('Name', adVarWChar, 8);
end;
Indexes.Append(Index, EmptyParam);
end;
Tables.Append(Table);
end;
end;
2. 通过JRO压缩数据库
procedure TForm1.btnCompactDBClick(Sender: TObject);
var
JetEngine: IJetEngine;
strTagCon: string;
strSourceCon: string;
begin
JetEngine := CoJetEngine.Create;
strSourceCon := 'Provider=Microsoft.Jet.OleDB.4.0;' + 'Data Source=d:\ComTest\myDb.mdb;' +
'Jet OLEDB:Engine Type=5;' + 'Locale Identifier=0x0804;' + 'Jet OLEDB:Database Password=mypwd';
strTagCon := 'Provider=Microsoft.Jet.OleDB.4.0;' + 'Data Source=d:\ComTest\myDb1.mdb;' +
'Jet OLEDB:Engine Type=5;' + 'Locale Identifier=0x0804;' + 'Jet OLEDB:Database Password=mypwd';
JetEngine.Compact Database(str Source Con, str TagCon);
end;
以上在Delphi5.0、ADO2.1下运行通过。
感觉怎么样?对于VCL组件没有的,通过COM接口来实现(当然要基于COM的)是非常方便的。利用COM可以扩充Delphi组件不具有的功能,如果你有兴趣,还可以自己定制VCL组件让大家分享,那时别忘了通知我一声。 (合肥 黄先国)