使用COM扩充DELPHI数据库功能

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 OLEDB:Database 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 OLEDB:Database Password=mypwd';
  strTagCon:=
  'Provider=Microsoft.Jet.OleDB.4.0;'
  +'Data Source=d:.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组件让大家分享,那时别忘了通知我一声。 (合肥 黄先国)
 
顶部