zoukankan      html  css  js  c++  java
  • delphi实现ado的高级功能

     

      ADO是Microsoft存取通用数据源的标准引擎。ADO通过封装OLE DB而能够存取不同类型的数据,让应用程序能很方便地通过统一的接口处理各种数据库。ADO由一组COM对象组成,每一个不同的原生ADO对象负责不同的工作。下面,向大家介绍如何使用原生ADO对象的动态属性来实现ADO的高级功能。

      ADO原生对象关系图:

      Connection

      Errors→Error

      Command→Parameters→Parameter

      RecordSet→Fields→Field

      一、存取原生ADO对象

      Delphi中的ADO组件页中的组件为我们通过ADO技术访问数据库提供了方便。这些组件封装了原生的ADO对象。虽然我们利用ADO组件页中的组件也能编写出有效率的数据库程序,但是ADO中的一些属性和方法仍然是ADOExpress组件没有封装进去的,而此时,需要使用这些没有封装的属性和方法,必须还得通过存取原生的ADO对象来使用这些属性和方法。

      在ADO组件中,每个组件都有一个属性让程序员通过它来存取它所封装的原生ADO对象。下面我们用表1来说明ADO组件页中ADO组件封装原生ADO对象的属性:

      在程序中访问ADO组件封装的原生ADO对象,例如:

      Var

      MyRS :_RecordSet;

      MyRS :=ADODataSet1.RecordSet;

      以上这句就是访问组件封装的原生ADO对象RecordSet。

      二、存取原生ADO对象的动态属性

      当我们用ADO组件编写针对特定数据库的应用程序时,ADO驱动程序会将特定数据库所能提供的功能存储在动态属性之中。在ADO模型中,每一个原生AD

      O对象都有一组动态属性。

      注意:在Delphi中,只能通过原生的ADO对象来存取动态属性。

      原生的ADO对象的动态属性集合存储在名为Properties的数组结构中,Properties数组中的每一个数组元素Property就对应一个特定的动态属性。因此,访问原生ADO对象的动态属性的基本步骤是:

      1. 通过ADO组件的属性访问其封装的原生的ADO对象;

      2. 利用原生的ADO对象访问其Properties动态属性集合;

      3. 在Properties动态属性集合中访问Property动态属性;

      4. 存取Property动态属性的值,实现ADO组件未封装的功能。

      Delphi为我们访问动态属性集合Properties提供了几个方便的接口函数供我们调用:

      Function Get_Item(Index : OleV

      ariant) :Property; SafeCall;//根据动态属性的索引值或名称获取动态属性

      Property Item[Index :OleVariant

      ] :Property Read Get_Item;//根据动态属性在集合中的索引值来获取动态属性

      Delphi也提供了以下的属性来方便地访问动态属性Propery的名称和值:

      Name 动态属性的名称

      Value 动态属性的值

      为了说明这些原理,我们用一个简单的例子来说明。这个例子中,程序运行后点击按钮,在Memo中就会显示原生的ADO对象RecordSet的所有动态属性。

      1. 建立一个新的工程,保存为Project1.dpr;

      2. 在主窗体上放置如下组件:

      TAdoConnection、TAdDataSet、TMemo、TButton

      3. 将TAdoConnection的Conne

      ctionString属性连接到SQL SERVE

      R 数据库的Pubs数据库;

      4. 设置TAdoDataSet的Connecti

      on属性为上一步中的TAdoConnecti

      on组件;

      5. 编写按钮的Button1Click事件处理函数代码如下:

      procedure TForm1.Button1Click(S

      ender: TObject);

      Var

      i :Integer;

      MyPty :Property_;

      MyPties :Properties;

      MyRS :_RecordSet;

      begin

      AdoDataSet1.Open;

      MyRS :=AdoDataSet1.RecordSet; //获取原生的ADO对象赋值给MyRS

      MyPties :=MyRS.Properties; //获取原生ADO对象的动态属性集合Prop

      erties赋值给MyPties

      For i :=0 to MyPties.Count-1 do //循环取得动态属性集合Properties中的每一个动态属性

      begin

      MyPty :=MyPties.Item[i]; //动态属性集合MyPites的Item属性根据索引值取得每一个动态属性赋值给MyPty

      Memo1.Lines.Add(MyPty.Name); //动态属性MyPty的Name属性表示该动态属性的名字,将动态属性的名字加入到Memo1列表中。

      end;

      end;

    源码:

    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, DB, ADODB, StdCtrls;

    type
    TForm1 = class(TForm)
    Button1: TButton;
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    Var
    i :Integer;
    MyPty :Property_;
    MyPties :Properties;
    MyRS :_RecordSet;
    begin
    with ADOQuery1 do
    begin
    Close;
    sql.Add('select * from dzywdw where 1=2');
    Open;
    MyRS := ADOQuery1.Recordset; //获取原生的ADO对象赋值给MyRS
    MyPties :=MyRS.Properties; //获取原生ADO对象的动态属性集合Prop
    //erties赋值给MyPties
    For i :=0 to MyPties.Count-1 do //循环取得动态属性集合Properties中的每一个动态属性
    begin
    MyPty :=MyPties.Item[i]; //动态属性集合MyPites的Item属性根据索引值取得每一个动态属性赋值给MyPty
    Memo1.Lines.Add(MyPty.Name); //动态属性MyPty的Name属性表示该动态属性的名字,将动态属性的名字加入到Memo1列表中。
    end;
    end;

    end;

    end.

    object Form1: TForm1
    Left = 192
    Top = 130
    Width = 979
    Height = 563
    Caption = 'Form1'
    Color = clBtnFace
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    OldCreateOrder = False
    PixelsPerInch = 96
    TextHeight = 13
    object Button1: TButton
    Left = 344
    Top = 104
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
    end
    object Memo1: TMemo
    Left = 136
    Top = 160
    Width = 649
    Height = 241
    Lines.Strings = (
    'Memo1')
    TabOrder = 1
    end
    object ADOConnection1: TADOConnection
    ConnectionString =
    'Provider=SQLOLEDB.1;Password=Founder123;Persist Security Info=Tr' +
    'ue;User ID=sa;Initial Catalog=K_昆山金箭_2013_12_30;Data Source=dzys' +
    '-yserp'
    LoginPrompt = False
    Provider = 'SQLOLEDB.1'
    Left = 696
    Top = 72
    end
    object ADOQuery1: TADOQuery
    Connection = ADOConnection1
    Parameters = <>
    Left = 696
    Top = 144
    end
    end

  • 相关阅读:
    DDD实战进阶第一波(三):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架二)
    DDD实战进阶第一波(二):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架一)
    01-JavaScript之变量
    18-TypeScript模板方法模式
    17-TypeScript代理模式
    16-TypeScript装饰器模式
    15-TypeScript策略模式
    真的可以「 人人都是产品经理 」吗
    如何从程序员到架构师?
    除代码之外,程序员还有哪些能力也非常的关键?
  • 原文地址:https://www.cnblogs.com/zhangzhifeng/p/3531216.html
Copyright © 2011-2022 走看看