什么是ADO?(100分)

  • 主题发起人 主题发起人 肥涛
  • 开始时间 开始时间

肥涛

Unregistered / Unconfirmed
GUEST, unregistred user!
俺刚学Delphi,常听人说ADO,不知道到底是个啥?
那位大哥能给俺详细讲讲ADO,让俺也入一下门?
哪里有ADO的控件下载?
 
Delphi中有ADO控件组
ActiveX DataAcess Object
 
推荐你到http://cakk.126.com下载李维的<<ado/mts/com+>>一书的前四章看一看,
 
楼上说的没错
 
是OLEDB技术,你可能知道ODBC这个东西,反正它们都是那种提供给编程人员对
链接到数据库的一种方法。特别是不需要取关心联结到不同数库的麻烦,只要系统提供
一个特定数据库的引擎即可。而ODBC(Open DataBase Connectivity)既是这个意思
OLEDB是另一种别认为更有前途,比微软的ODBC 好的多的数据库联结技术。
但是呢,她这个东西比较底层,不方便开发人员直接使用它提供的那些方法去进行数据库
程序的开发, 从而诞生了 ADO 控件。
它将OLEDB中的主要数据库操作功能,像联接数据库,取数据集等基本功能封装起来供程序员
使用。所以一切都简单了,只用使用几个ADO控件,一切复杂的功能 只需要几句话就可以
解决了。
像要链接到一个特定数据库。你可以使用 TADOConnection 控件建立联结,不过必须要
该种类的数据库提供OLEDB可使用的jet引擎,像MSSQL Server, Access, Oracle等都有。
然后可以使用几个 TADOTable,TADOQuery, TADODataSet等等控件实现取出数据库中的
特定内容,或者进行查询,删除,添加等基本操作。和Delphi的数据控件基本一样的功能。
只不过后台实现的方法不同。







 
简单说是一种连接数据库的接口,类似BDE。更详细的看书吧
 
我看不到啊!在Delphi的哪个page上?
 
你是用的 Delphi5 吗?
 
我只有正版的4。0,5没有正版的,所以没用过!
 
4.0的没有ADO控件.5没有正版的就不用吗?其实D版与正版功能相同.
 
领导怕染病毒,非正版软件一概不准用!
 
Microsoft有三组数据库编程对象:数据访问对象(DAO)、远程数据对象(RDO)和ActiveX数据对象(ADO)。
Delphi下的ADO

本文向您揭示在Delphi中使用ADO是如何轻而易举,结合了ADO的Delphi应用程序,将不再依赖于BDE。
ADO的精髓在于利用简单的COM指令来快速方便的访问ODBC数据源,微软的表格、列表框等ActiveX控件使得用户可以简便的利用ADO工作;然而,本文中笔者仅仅向您展示了如何利用程序访问数据库,将不采用任何可视化数据控件。
本文将向您展示如何利用Variant或interfaces访问和修改ADO数据库,示例程序非常简单,可运行于Delphi 3或4。
安装和访问一个ADO数据库。
示例程序的代码不足150行,然而运行本程序必须首先安装ADO以及设置ODBC数据源。
ADO是一组COM组件的集合,允许程序员利用利用少量的简单代码访问数据库。
ADO通常和OLEDB、Universal Data Access以及Microsoft Data Access Components(MDAC)联系在一起。OLEDB产生较ADO为早,是后期各种技术的基础。
如果你已经安装了ADO,你会在你的计算机中发现ADODB.DLL或者是MSADO15.DLL,这些文件中包含了一个类库,其中包括了利用ADO编程所需的全部接口和常量。在Delphi中,选择菜单Project | Import Type Library,选择以上的DLL文件,然后确定,系统生成了一个基于ADODB.DLL的ADODB_TLB.Pas文件,这个文件中包含了所有Delphi ADO编程所需的声明。
最后一步的准备工作就是将Delphi演示数据库中的Clients.DBF设置为ODBC系统DSN,其别名为DBDemosDBase,驱动程序为Dbase 5。
以下程序清单同时利用Variants和Interfaces访问ADO:
unit Main;{---------------------------------------------------------------------
Created Jan 5, 1999. Copyright (c) 1999 by Charlie Calvert
----------------------------------------------------------------------}
interface


uses Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ComObj, Grids, ADODB_TLB, ExtCtrls;


const
SELECTSTRING = 'SELECT * FROM Clients.dbf';
DSNSTRING = 'DBDemosDBase';
type TForm1 = class(TForm)
StringGrid1: TStringGrid;
Panel1: TPanel;
VariantBtn: TButton;
InterfaceBtn: TButton;
UpdateBtn: TButton;
Edit1: TEdit;
procedure VariantBtnClick(Sender: TObject);
procedure InterfaceBtnClick(Sender: TObject);
procedure UpdateBtnClick(Sender: TObject);
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);

private
procedure Display(RecordSet: _RecordSet); { Private declarations }
public { Public declarations }
end;
var Form1: TForm1;implementation
uses
ActiveX;
{$R *.DFM}
procedure TForm1.Display(RecordSet: _RecordSet);
var
Y, i: Integer;
begin
Y := 1;
repeat
for i := 0 to 6 do
StringGrid1.Cells[i, Y] := RecordSet.Fields.Value;
RecordSet.Move(1, EmptyParam);
Inc(Y);
until RecordSet.EOF;
end;
procedure TForm1.InterfaceBtnClick(Sender: TObject);
var RecordSet: _RecordSet;
DSN: string;
begin
// 生成空的recordset object
OleCheck(CoCreateInstance(CLASS_RecordSet, nil,
CLSCTX_ALL, IID__RecordSet, RecordSet));
DSN := 'dsn=' + DSNSTRING;
// 填写数据
RecordSet.Open(SelectString, DSN, adOpenForwardOnly,
adLockReadOnly, adCmdUnspecified);
// 显示数据
Display(RecordSet);
UpdateBtn.Enabled := True;
end;
procedure TForm1.UpdateBtnClick(Sender: TObject);
var RecordSet: _RecordSet;
DSN: string;
begin
OleCheck(CoCreateInstance(CLASS_RecordSet, nil,
CLSCTX_ALL, IID__RecordSet, RecordSet));
DSN := 'dsn=' + DSNSTRING;
// Fill the recordset
RecordSet.Open(SELECTSTRING, DSN, adOpenDynamic,
adLockOptimistic, adCmdUnspecified);
// 修改
RecordSet.Move(StringGrid1.Row - 1, EmptyParam);
RecordSet.Fields[StringGrid1.Col].Value := Edit1.Text;
RecordSet.Update(EmptyParam, EmptyParam);
RecordSet.MoveFirst;
Display(RecordSet);
end;
procedure TForm1.VariantBtnClick(Sender: TObject);
var
RecordSet: OleVariant;
Y, i: Integer;
begin
// Create an empty recordset object
RecordSet := CreateOleObject('ADODB.Recordset');
// Fill the recordset
RecordSet.Open(SELECTSTRING, DSNSTRING);
// Display the data
Y := 1;
repeat
for i := 0 to 6 do
StringGrid1.Cells[i, Y] := RecordSet.Fields.Value;
RecordSet.Move(1);
Inc(Y);
until RecordSet.EOF;
end;
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
Edit1.Text := StringGrid1.Cells[ACOl, ARow];
end;
end.
这个程序有三个按钮,一个StringGrid以及一个编辑框,第一个按钮利用以Variants连接的ADO填充表格,第二个则利用Inteface进行连接。
第三个按钮用于修改数据,当用户单击StringGrid的单元格时,单元格中的数据会显示于编辑框中,可以修改编辑框中的数据,然后单击这个按钮,将会修改这个单元格以及数据库中的数据。
ADO中含有许多不同的对象,本文将集中讲述RecordSet和Fields这两个对象。
可以用如下的代码生成一个RecordSet的实例:
var
RecordSet: OleVariant;
begin
RecordSet := CreateOleObject('ADODB.Recordset');
... // Code omitted here
end;
CreateOleObject声明于ComObj.Pas中。它是ActiveX.Pas中的核心函数CoCreateInstance的一个简单包装。
要打开数据库,可利用以下代码:
const
SELECTSTRING = 'SELECT * FROM Clients.dbf';
DSNSTRING = 'DBDemosDBase';

begin
RecordSet := CreateOleObject('ADODB.Recordset');
RecordSet.Open(SELECTSTRING, DSNSTRING);
.. // Code omitted here
end;
Open方法有很多参数,但是在这个程序中我们只处理其中的两个。第一个是我们要执行的SQL语句,第二个是我们要操作的数据库。
当打开一个数据集时,数据集游标位于第一个记录,可以用下面的代码访问这个记录:

MyString := RecordSet.Fields[0].Value;
MyString := RecordSet.Fields[1].Value;

要移动游标,可以用RecordSet对象的Move方法:
RecordSet.Move(1);


利用Interface访问ADO:

利用Interface访问ADO的步骤同从前的例子大致相同:

procedure TForm1.InterfaceBtnClick(Sender: TObject);
var RecordSet: _RecordSet;
DSN: string;
begin
// Create an empty recordset object
OleCheck(CoCreateInstance(CLASS_RecordSet, nil,
CLSCTX_ALL, IID__RecordSet, RecordSet));
DSN := 'dsn=' + DSNSTRING;
// Fill the recordset
RecordSet.Open(SelectString, DSN, adOpenForwardOnly,
adLockReadOnly, adCmdUnspecified);
// Display the data
Display(RecordSet);
UpdateBtn.Enabled := True;
end;

同前一节的代码不同,这些代码必须包含ADODB_TLB.PAS。
这一段代码用ADODB_TLB.PAS中声明的_RecordSet代替了Variants。
这里直接调用了CoCreateInstance来生成对象的实例。第一个参数传递了声明于ADODB_TLB.PAS中的常量CLASS_RecordSet,它代表RecordSet的Class ID,第四个参数为IID__RecordSet,也是声明于ADODB_TLB.PAS中的,注意,它带有两条下划线!最后一个参数是我希望建立的实例。
当调用recordSet.Open的时候,应该穿第五个参数。
const
SELECTSTRING = 'SELECT * FROM Clients.dbf';
DSNSTRING = 'DBDemosDBase';

begin
.. // Code omitted
DSN := 'dsn=' + DSNSTRING;
RecordSet.Open(SelectString, DSN, adOpenForwardOnly,
adLockReadOnly, adCmdUnspecified);
.. // Code omitted
end;
在前一节的例子中,可以只传递两个参数,这是因为Variants允许忽略参数,这时采用缺省值。当采用Interfaces时,则必须明确的定义参数。如果希望采用缺省值,则可以向下面这样调用函数:
RecordSet.Open(SelectString, DSN, EmptyParam, EmptyParam, EmptyParam);
在这里我们使用了EmptyParam这样一个Variant,它被声明于System.Pas,这些参数将采用缺省值。上面的例子中我用了声明于ADODB_TLB.PAS中的真正的缺省值。此类问题可参考Data Access SDK中的相关文件。
打开数据集以后,就可以用同上一节相同的方法显示数据。唯一的不同就是RecordSet.Move方法要有两个参数。
procedure TForm1.Display(RecordSet: _RecordSet);
var Y, i: Integer;
begin
Y := 1;
Repeat
for i := 0 to 6 do
StringGrid1.Cells[i, Y] := RecordSet.Fields.Value;
RecordSet.Move(1, EmptyParam);
Inc(Y);
until RecordSet.EOF;
end;

修改数据
当修改数据时,不能用打开数据集时使用的缺省值,而是应该传递以下的参数:
const
adOpenDynamic = $00000002;
adLockOptimistic = $00000003;
adCmdUnspecified = $FFFFFFFF;
begin
.. // Call CoCreateInstance
DSN := 'dsn=' + DSNSTRING;
RecordSet.Open(SELECTSTRING, DSN, adOpenDynamic, adLockOptimistic,
adCmdUnspecified);
.. // Code ommitted here
end;

无论你用的是Variants还是Interfaces,这段代码都将正常工作。
当你的数据集以可读写的方式打开时,如adLockOptimistic方式,就可以修改数据库的内容了:
RecordSet.Fields[0].Value := Edit1.Text;
RecordSet.Update(EmptyParam, EmptyParam);
这段代码可以修改当前记录的内容。当然也可以利用字段数组以及Move方法修改任何记录。如果用的是Variants方式,可以不传递任何参数。
在例子中,我采用了一种简单的方法来编辑表中的字段。如果用户在某一个字段商单击,其数值会显示于编辑框中:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
Edit1.Text := StringGrid1.Cells[ACOl, ARow];
end;

用于更新数据的代码如下:
RecordSet.Move(StringGrid1.Row - 1, EmptyParam);
RecordSet.Fields[StringGrid1.Col].Value := Edit1.Text;
RecordSet.Update(EmptyParam, EmptyParam);

第一行将数据集游标移动到表格当前行,第二行修改数据,第三行提交修改。
最后一步将把数据集游标移动到第一条记录,然后调用相同的过程显示修改后的数据库。
RecordSet.MoveFirst;
Display(RecordSet);



 
这是什么领导?我倒。。。
 
小聪真是太............
 
多人接受答案了。
 
to photodelphi:
你想说什么?大哥我没时间回答你的无聊问题!
 

Similar threads

回复
0
查看
1K
不得闲
D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部