首页  编辑  

使用COM扩充DELPHI数据库功能

Tags: /超级猛料/Database.数据库相关/ODBC、ADO、Access/   Date Created:
使用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; // 定义为_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:\ComTest\myDb.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:\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组件让大家分享,那时别忘了通知我一声。 (合肥 黄先国)