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 +

'-yserp'

LoginPrompt = False

Provider = 'SQLOLEDB.1'

Left = 696

Top = 72

end

object ADOQuery1: TADOQuery

Connection = ADOConnection1

Parameters = <>

Left = 696

Top = 144

end

end