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

delphi实现ado的高级功能的更多相关文章

  1. C#高级功能(二)LINQ 和Enumerable类

    介绍LINQ之前先介绍一下枚举器 Iterator:枚举器如果你正在创建一个表现和行为都类似于集合的类,允许类的用户使用foreach语句对集合中的成员进行枚举将会是很方便的.我们将以创建一个简单化的 ...

  2. Delphi通过ADO读写数据库

    ADO是一种程序对象,用于表示用户数据库中的数据结构和所包含的数据. ADO (ActiveX Data Objects,ActiveX数据对象)是Microsoft提出的应用程序接口(API)用以实 ...

  3. Xen之初体验:XenMotion、 StorageMotion、Site Recovery、Power Management 各种新、高级功能免费

    Xenserver 的新版本6.2现在已经全面开源,省掉了原有的序列号,也能免费体验曾经标题中的付费高级功能. 安装镜像:http://downloadns.citrix.com.edgesuite. ...

  4. Delphi 各版本新特性功能网址收集

    Delphi XE2 三个新功能介绍举例_西西软件资讯  http://www.cr173.com/html/13179_1.html delphi 2007新功能简介-davidxueer-Chin ...

  5. MVC5 Entity Framework学习之Entity Framework高级功能(转)

    在之前的文章中,你已经学习了如何实现每个层次结构一个表继承.本节中你将学习使用Entity Framework Code First来开发ASP.NET web应用程序时可以利用的高级功能. 在本节中 ...

  6. C#高级功能(四)扩展方法和索引

    扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.扩展方法被定义为静态方法,但 ...

  7. C#高级功能(三)Action、Func,Tuple

    Action和Func泛型委托实际上就是一个.NET Framework预定义的委托,3.5引入的特性.基本涵盖了所有常用的委托,所以一般不用用户重新声明. Action系列泛型委托,是没有返回参数的 ...

  8. C#高级功能(一)Lambda 表达式

    Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数. Lambda 表达式对于编写 LINQ ...

  9. iOS开发——UI篇Swift篇&玩转UItableView(二)高级功能

    UItableView高级功能 class UITableViewControllerAF: UIViewController, UITableViewDataSource, UITableViewD ...

随机推荐

  1. 【WCF--初入江湖】08 并发与实例模式

    08 并发与实例模式 1. 实例上下文模式   一个服务代理:servicePoxy ChannelFactory<IService1> factoryservicel = new Cha ...

  2. ajax post 跨域

    H5页面永远无法避开跨域问题-- php中, header('Access-Control-Allow-Origin:*'); 搞定. 兼容性先不管了. 来自为知笔记(Wiz)

  3. 解决unity3d发布的网页游戏放到服务器上无法使用的问题

    http://www.unity蛮牛.com/blog-2429-1226.html 第一次把unity3d发布的网页游戏放到服务器上(Win2003),发现无法使用.可以尝试以下办法.       ...

  4. 灵魂有香气的女子IOS版本APP,近期将考虑开放源代码

    实在太忙,灵魂有香气的女子这个App,断断续续开发了1个多月了,前后台自己独立完成, 由于接触swift没多久,还属于新手行列,不熟悉,希望大家给出意见, 根据意见,完善后将于近期将考虑开放swift ...

  5. poj 3358 Period of an Infinite Binary Expansion

    由乘2取整得到分数的小数位,可以找到规律!!! 例如:1/10,2/10,4/10,8/10,16/10,32/10,64/10…… 取整后:1/10,2/10,4/10,8/10,6/10,2/10 ...

  6. Fragment 与 Activity 通信

    先说说背景知识: (From:http://blog.csdn.net/t12x3456/article/details/8119607) 尽管fragment的实现是独立于activity的,可以被 ...

  7. 包含中文的字符串中截取前N个字符

    package com.wangzhu.string; import java.io.UnsupportedEncodingException; public class SubStringDemo1 ...

  8. hadoop 2.2.0的datanode中存储block的多个文件夹的负载均衡问题

    hadoop的分布式文件系统HDFS的存储方式是,将数据分成block,分布式存储在整个hadoop集群的datanode中,每个block默认的大小是64M,这些block文件的具体存储位置是在ha ...

  9. 利用Nginx搭建http和rtmp协议的流媒体服务器

    http://www.linuxidc.com/Linux/2013-02/79118.htm

  10. HorseCome

    紫气东来,祝福也随之而来,喜鹊登梅,福禄也登上眉梢,马年将至,喜庆将萦绕身旁,在这个美好的日子送上我最真挚的祝福,祝身体安康. 春晓,春晓,处处绿杨芳草.山山水水,欢欢笑笑,共祝六合同春,步步登高!