I
import
Unregistered / Unconfirmed
GUEST, unregistred user!
使用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中选择菜单ProjectType 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;//定义为_Catalog的接口类型
Table:_Table;
Index:_Index;
strCon:string;//定义连接字符串
begin
Catalog:=CreateComObject(Class-Catalog) as _Catalog;
//建立Catalog实例,也可以用 Catalog:=CoCatalog.Create;
strCon:='Provider=Microsoft.Jet.OleDB.4.0;'
//通过Jet OleDb直接操作Access数据库
+'Data Source=d:.mdb;'
//数据库位置
+'Jet OLEDB:Engine Type=5;'
//Jet 4.x格式,如为4,则Jet 3.x格式
+'Locale Identifier=0x0804;'
//支持简体中文(一定要有)
+'Jet OLEDBatabase Password=mypwd';
//加入密码
Catalog.Create(strCon); //建立数据库
{建立数据表和索引}
catalog._Set_ActiveConnection(strCon);
//连接到数据库
with Catalog do
begin //建立数据表
Table:=Create Com Object(Class-Table) as _Table; //建立Table实例
with Table do
begin
Name:='Tel';
Columns.Append('Name',adVarWChar,8);
//数据类型详见MDAC SDK
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:.mdb;'
+'Jet OLEDB:Engine Type=5;'
+'Locale Identifier=0x0804;'
+'Jet OLEDBatabase Password=mypwd';
strTagCon:=
'Provider=Microsoft.Jet.OleDB.4.0;'
+'Data Source=d:.mdb;'
+'Jet OLEDB:Engine Type=5;'
+'Locale Identifier=0x0804;'
+'Jet OLEDBatabase Password=mypwd';
//可以以此改变数据库密码
JetEngine.Compact Database(str Source Con,str TagCon);
end;
以上在Delphi5.0、ADO2.1下运行通过。
感觉怎么样?对于VCL组件没有的,通过COM接口来实现(当然要基于COM的)是非常方便的。利用COM可以扩充Delphi组件不具有的功能,如果你有兴趣,还可以自己定制VCL组件让大家分享,那时别忘了通知我一声。 (合肥 黄先国)
--------------------------------------------------------------------------------
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中选择菜单ProjectType 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;//定义为_Catalog的接口类型
Table:_Table;
Index:_Index;
strCon:string;//定义连接字符串
begin
Catalog:=CreateComObject(Class-Catalog) as _Catalog;
//建立Catalog实例,也可以用 Catalog:=CoCatalog.Create;
strCon:='Provider=Microsoft.Jet.OleDB.4.0;'
//通过Jet OleDb直接操作Access数据库
+'Data Source=d:.mdb;'
//数据库位置
+'Jet OLEDB:Engine Type=5;'
//Jet 4.x格式,如为4,则Jet 3.x格式
+'Locale Identifier=0x0804;'
//支持简体中文(一定要有)
+'Jet OLEDBatabase Password=mypwd';
//加入密码
Catalog.Create(strCon); //建立数据库
{建立数据表和索引}
catalog._Set_ActiveConnection(strCon);
//连接到数据库
with Catalog do
begin //建立数据表
Table:=Create Com Object(Class-Table) as _Table; //建立Table实例
with Table do
begin
Name:='Tel';
Columns.Append('Name',adVarWChar,8);
//数据类型详见MDAC SDK
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:.mdb;'
+'Jet OLEDB:Engine Type=5;'
+'Locale Identifier=0x0804;'
+'Jet OLEDBatabase Password=mypwd';
strTagCon:=
'Provider=Microsoft.Jet.OleDB.4.0;'
+'Data Source=d:.mdb;'
+'Jet OLEDB:Engine Type=5;'
+'Locale Identifier=0x0804;'
+'Jet OLEDBatabase Password=mypwd';
//可以以此改变数据库密码
JetEngine.Compact Database(str Source Con,str TagCon);
end;
以上在Delphi5.0、ADO2.1下运行通过。
感觉怎么样?对于VCL组件没有的,通过COM接口来实现(当然要基于COM的)是非常方便的。利用COM可以扩充Delphi组件不具有的功能,如果你有兴趣,还可以自己定制VCL组件让大家分享,那时别忘了通知我一声。 (合肥 黄先国)