1)移动指针
第一个: ADotable1.First;
最后一个: ADotable1.Last;
下一个: ADotable1.Next;
前一个: ADotable1.Prior;
2)从字段中取出数据
通过如下方法可以访问字段的值
ADOtable1.FieldValues['字段名']
ADOtable1.Field[索引值]
在读写字段的时候,又是根据需要可以加上强制类型转换
例如:
Edit1.text:=ADOtable1.Field[0].AsString;
用下面的方法可以去除字段的性质:
ADOtable1.fielddefs[索引值].name; 字段名
ADOtable1.fielddefs[索引值].Size; 字段大小
ADOtable1.fielddefs[索引值].Datatype; 字段属性
3)修改数据:
修改数据的时候,需要先建立EDIT方法,然后用Post方法才能真正的写入。
ADOtable1.edit;
ADOtable1.FieldValues['姓名']:='王秀琴';
ADOtable1.post;
4)增加一条空纪录: ADOtable1.append;
新增纪录也可以用如下方法,在新增纪录的同时输入数据
ADOtable1.appendRecord(xxx,xxx,xxx,....);
5)删除当前纪录:ADOtable1.delete;
如果在ADOtable1的OnBeforeDelete方法中写下:
if messagedlg('确实要删除吗?',mtinformation,[mbyes,mbno],
0)=mrno then abort();
可以实现删除前的提示。
6)过滤
可以用如下的方法实现数据的过滤
在ADOtable1的OnFilterRecord方法中写下:
Accept:=(条件);
然后
ADOtable1.filtered:=true; 为实现过滤。
ADOtable1.filtered:=false; 为解除过滤。
7)指针在文件的头尾
指针在最后一条记录之后 ADOtable1.Eof
指针在第一条记录之前 ADOtable1.Bof
如此可以实现对数据库的遍历
form1.ADOtable1.first;
while not form1.ADOtable1.eof do
Begin
.......
form1.ADOtable1.next;
End;
8)此外, ADOtable组件还继承了ADO 中的RecordSet对象几乎全部属性和方法,简述如下:
with adoTable1.Recordset do
begin
//属性
PageSize 一页所包含的记录数
PageCount 数据的页数
AbsolutePage; 当前记录所在页
AbsolutePosition; 当前记录的序号位置
BOF; 指针在第一个记录之前
EOF; 指针在最后一个记录之后
//方法
AddNew fieldList,Values; 创建新记录,其中fieldList为用数
组表示的字段名集,Values为用数组表
示的数据集。
Cancel; 取消上一步所作的修改
Update Fields,Values; 保存对当前记录所作的修改
Delete; 删除当前记录
Move(n); 移动n 条记录
MoveFirst; 移动到第一条纪录
MoveLast; 移动到最后一条纪录
MoveNext 移动到下一条纪录
MovePrevious 移动到上一条纪录
Requery; 通过从新执行对象所基于的查询,以
更新RecordSet 对象中的数据。
end;
使用Recordset 对象来处理数据集的数据,会发现数据帮定控件的指针一般不会跟着移动,这实际上给设计者提供了另一个在后台快速处理数据的方法。
附录:关于TActionList控件的使用
在Standard面板,提供了一个TActionList 控件,它集中了大部分按钮的使用方法,可以简化按钮的设计。
方法:
调入TActionList,双击,可以看到一个面板,右键 -〉New Standard Action 选择 Datasat下的适当的控制,可以选择多个。
以后加入的开关,只要在属性Action 中选择适当的项目就可以了,不需要专门编程,实例见“ActionList应用”。
第四节 ADOQuery组件
和ADOtable组件一样,ADOquery继承了同一个父类TCustomADODataSet,所以,上面说到的ADOtable属性事件和方法基本上是通用的,但它主要是针对数据库中的SQL 命令进行操作。
下面主要说一下ADOquery特殊的地方。
1)SQL 属性
SQL 是TStrings类型的属性,包含了ADOquery组件要执行的SQL 命令,是ADOquery最为重要的属性之一。
在应用程序中,需要调用Open方法或者ExecSQL 方法来执行在SQL 中的命令。在设计阶段,可以利用属性编辑起来编写。
例如:
Width ADOquery do
Begin
//重新写入时,要关闭原来的查询
Close;
width SQL do
Begin
//因为Add是在原来的基础上加入,所以先清除原来的SQL命令
Clear;
Add('selsct 编号,姓名,奖金')
Add('From 奖金表')
End;
//执行SQL 命令
Open;
End;
查询命令也可以这样来写:
s1:='编号';
s2:='姓名';
s3:='金额';
with ADOquery1 do
begin
sql.Clear;
SQL.Add('select ');
SQL.Add(s1+','+s2+','+s3);
SQL.Add(' From 奖金 ');
execsql;
active:=true;
end;
效果是一样的。
第五节 ADOConnection 和 ADODataSet
虽然ADOTable和ADOQuery组件可以非常简单的连接数据库,但是当需要更加精细的控制数据库的时候,往往需要应用ADO 更多的方法,我们知道,支撑ADO 的主要由Connection,Command,Recordsrt三个对象组成, 对应的就有ADOConnection和ADOCommand控件,而Recordsrt对象属性和方法,封装在ADODataSet中,同时ADODataSet本身,也具备和ADOtable组件相同的对数据绑定控件控值的属性和方法。
这就大大提高了对数据库的控制能力。
在ADO 顶层有三个对象中Connection处在最顶层,用以指定数据源,建立和数据源的连接。所以,ADOConnection必须和其它的数据控件连接才有效,最常用的就是和ADODataSet配合。
下面首先介绍连接方法,然后再讨论其它的问题
1)ADOConnection的加入和连接
加入ADOConnection
属性:ConnectionString='连接字符串'
加入ADODataSat
属性:Connection='ADOConnection1' ..... (ADOConnection,Name)
CommandType=cmdtable ...使用表连接
CommandText 根据上面的选择,或选择表,或出现SQL 编辑框。
Active=True 激活。
加入DataSource
属性:Dataset=ADODataSat 完成连接,再连接数据绑定控件。
2)ADOConnection的重要属性和方法
属性:
a).Attributes
设置连接的数据库自动处理事务的能力
xCommitRetaining:提交一个事务后自动开始一个新事务
xAbortRetaining :回退一个事务的同时开始一个新事务
b).Connected
标识和数据库的连接受否处于激活(True)
方法:
c).Open(UserID,PassWord)
打开一个连接(可以提供用户名和密码)
d).Cancel
关闭数据库的连接
e).Close
释放所有的系统关联资源
f).Execute 执行一个SQL 命令。
完整的表述是
Execute(SQL命令,该命令设计的记录数目,Option)
其中,Option的值如下
eoAsyncExecute 异步执行指定的命令
eoAsyncFetch 给定Cache属性的值后,再异步的取得数据
eoAsyncFetchNonBlocking 非阻塞式线程执行
eoExecuteNoRecords 没有返回纪录
g).GetProcedureNames(List:Tstring);
获取数据库服务器上的存储过程名称,过程名保留在List参数中。
f).GetTableNames(List:Tstring;SystemTables:Boolean=False)
获取数据库的数据表,表名存放在List参数中,SystemTables指示是否获取数据库系统表的名称,系统表是关于数据库类型定义和用户信息的数据表,是数据库本身自动产生的。在特殊的设计中,这个表格可能会有用。
3)ADODataSet的属性和方法
我们在ADOTable中讨论的属性和方法,几乎都可以在ADODataSet中得到应用,但还有几个特殊的属性:
CommandType
主要用于控制CommandText属性的状态,其中:
cmdtable ...CommandText使用“表名”连接
(内部是做了SQL 对各列的查询);
cmdTableDirect ...CommandText使用“表名”连接
(内部不做SQL ,而是真正的表名连接);
cmdtext ....使用SQL命令文本;
cmdfile ....CommandType属性值作为持久的文件名;
cmdStoredProc...CommandType属性值作为存储过程名称
来计算;
cmdUnKnown ....不知道(默认为SQL)
CommandText
根据CommandType的设置,向提供者发出“表名”或SQL 命令。
第六节 TADOCommand对象
在ADO 的层次结构中,Command对象和RecordSet是处在同一层上,它主要用来对数剧源执行指定的命令,比如SQL 语句,表和存储过程的名称、更新数据,插入纪录等。虽然其它的控件也能执行这些方法,但需要遇到需要用Command 本身的属性和方法来控制数据源的时候,利用这个对象将是十分方便的事情。
主要属性:
CommandType
CommandText
Cancel
和上面介绍的相同
Assign(Source:Tpersistent)
把另一个ADOCommand 组件的所有属性复制到当前的ADOCommand组件中,调用的时候按名存取组件对象。
下面的例子可以看到ADOConnection、TADOCommand、ADODataSet、DataSource和其它数据绑定控件是如何作用的。
放入控件
ADOConnection
TADOCommand
ADODataSet
DataSource
Memo
DBgrid
Button
属性(注意一下TADOCommand1和ADODataSet1的关系是平等的):
ADOConnection1---ConnctionString=连接字符串
TADOCommand1-----Connection=ADOConnection1
commandType=cmdText
ADODataSet1 -----Connection=ADOConnection1
commandType=cmdText
DataSource1 -----DataSet=ADODataSet1
Memo1 -----------List=空
DBgrid1----------DataSource=DataSource1
Button1的Click事件过程
procedure TForm1.Button1Click(Sender: TObject);
var str1,str2:string;
begin
//取出输入的SQL 语言
str1:=trim(Memo1.text);
//由于执行SQL语言时,除了select ,其它诸如Insert,Delete,Update都需要事先关闭数
//据集,所以下面把前六个字符取出来作为判断的依据。
str2:=copy(str1,0,6);
ADOCommand1.CommandText:=str1; //ADOCommand1执行命令
//检查用户是否送入的是select语句
if str2='select' then
begin
ADODataset1.Recordset:=ADOCommand1.Execute;
ADODataset1.Open;
end
else
begin
//先关闭数据集
ADODataset1.Close;
//这是另一种执行SQL 命令的方法,执行delete等操作
ADOCommand1.Execute;
//按全部字段送入SQL
ADODataset1.CommandText:='select * from 奖金';
ADODataset1.Open; //重新打开
end;
end;
第七节 TADOStoredProc对象
当应用程序必须使用数据库中的存储过程的时候,也可以使用ADOStoredProc 控件。
一个存储过程是一组语句,提前建立好保存在数据库服务器上,可以反复被执行,在服务器上完成和数据库有关的任务,并将结果传给用户。
许多存储过程在运行时还需要一系列的参数,可以通过Parameters属性来设置,这个数据集和其它的ADO 数据集相似,可完成类似的任务。
主要属性:
Active 设为true时激活数据集;
Connection 如果应用程序添加了ADOConnection,可以在这里连接;
ConnectionString 如果没有Connection属性,可以在这里做连接字符串;
DataSource 设置另一个数据源,一般不要设置,事实上如果这样做Delphi会报错;
Filter 设置筛选纪录的条件;
Filtered 决定是否激活Filter中设置的筛选条件;
Parameters 设置存储过程中使用参数的属性;
ProcedureName 设置数据集使用存储过程的名字,可以用下拉菜单选择。
主要方法
DeleteRecords 删除一条或多条纪录
Edit 设置数据集为编辑状态
EnableCountrols 使数据绑定控件显示数据
DisableCountrols 使数据绑定控件不显示数据
First 指针指向第一条纪录
Last 指针指向最后一条纪录
Prior 指针指向上一条纪录
Next 指针指向下一条纪录
MoveBy(n) 指针指向前或后的第n 条纪录
GetFieldData 把一个字段的当前值提取到缓存中去
IsEmpty 判断一个数据集是否为空
Open 打开一个数据集
Refresh 重新从数据库中提取数据更新数据集
ADOStoredProc的主要的事件与ADOQuery基本相同,可以参考使用。
第八节 主从结构的数据库应用程序
主从结构的数据库应用程序,是属于数据库的高级应用技术,下面我们通过一个实例来说明建立这种数据库应用程序的方法。
1)建立主从结构
加入 ADOTabl1:
属性
Connectionstring=连接字符串
Tablename=表名
Active=true 激活
加入 Datasource1
属性
DataSet=ADOTable1
连接上主表,做上有关的绑定控件
下面做从表
加入 ADOTabl2:
属性
Connectionstring=连接字符串
Tablename=表名
Active=true 激活
下面是做主从表的关键(在ADOTabl2中)
MasterSource=DataSource1
MasterFields=连接字段
(点..出现对话框,选中两个表的连接字段,Add 加入,Ok)
这就完成了主从表的连接
加入 Datasource2
属性
DataSet=ADOTable2
连接绑定控件
观察主从表的工作情况,这个方法几乎对所有的Delphi数据库控件都是适用的。
第九节 BDE 的应用
BDE 是Borland开发的最成熟的数据控制对象集,它对于像Oracle这些第三方数据库,由于是直接由开发商提供了驱动程序,所以执行效率比较高,到现在仍然受到不少程序员的欢迎。
它里面主要是table和Query两个数据源控件。从性能和使用方法都和ADOtable和ADOQuery 相似的(Recordset属性和方法除外,这是ADO 特有的)值得注意的是,它们连接数据源的方式采用了别名,也就是应用的时候事先一定要设计好ODBC数据源,并给定数据源一个别名。
属性
DatabaseName=别名
在table中,TableName=表名
在Query中,SQL=SQL命令
然后
Active=true
就连接上了。
ODBC数据源的别名,实际上是写入计算机的注册表的,所以如果希望通过程序来设置别名,可以通过程序直接改写注册表来解决,具体请看实例。
一、Ttable组件
该组件用来表示数据库的一个基表,它的主要属性如下:
DatabasName:数据源的名字
TableName: 表的名字
Active: true表示活动
Filter: 数据筛选
Filtered: 控制Filter的使用,False则筛选不起作用。
FilterOptions:其中包括两个选项
foCaseInsensitive 决定是否严格按照Filter条件中大小写匹配查询,true为大小写匹配。
foNoPartialCompare
“*”是否作为数字统配符存在,true 则视为单个字符,false则视为统配符。
IndexFieldNames 设置那些字段进行记录的排序,逗号间隔,这些字段必须是关键字端。
IndexName 设置基表的第二个索引字段,如果这个属性是空的,则基表按默认索引排序。
MasterSource 在主从表关系中,设置从表关联的主表对应数据源。
MasterFields
别名和表名调用的实例:
-----------------------------------------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, DBTables;
type
TForm1 = class(TForm)
Database1: TDatabase;
Session1: TSession;
Table1: TTable;
Button1: TButton;
ComboBox1: TComboBox;
ListBox1: TListBox;
Label1: TLabel;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var I: Integer;
DBNames: TStrings;
begin
DBNames := TStringList.Create;
//Session1.GetDatabaseNames(DBNames);
Session1.GetdatabaseNames(DBNames);
for I := 0 to DBNames.Count - 1 do
ComboBox1.Items.Add(DBNames[I]);
Database1.GetTableNames(ListBox1.Items, False);
end;
{ADOConnection1.GetTableNames(ListBox2.Items, False);
Database1.GetTableNames(ListBox1.Items, False);}
procedure TForm1.Button2Click(Sender: TObject);
begin
Database1.Close;
Database1.AliasName:= ComboBox1.Text;
Database1.Open;
ListBox1.Clear;
Database1.GetTableNames(ListBox1.Items, False);
end;
end.
-----------------------------------------------------------------------
第十节 开发InterBase应用程序
InterBase数据库是Borland公司开发的数据库产品,在Borland产品得到广泛的应用。该数据库是Delphi和Kylix(被称作Linux下的Delphi)开发的跨平台应用程序可用的数据库之一(其它还有Qracle、MySQL、DB2)。InterBase 有与Delphi结合紧密的特点,而且,在Delphi安装盘中。还提供了InterBase 数据服务和客户端软件,可以方便的构筑InterBase数据库的开发环境。
InterBase 的组件都放在InterBase面板中,从使用方法上来说,和上面介绍的BDE 或者ADO 相似,可以自己查阅有关资料。
这里就不再讨论了。
第十一节 dbExpress数据库控制
dbExpress 是Delphi 6.0 新加的功能,dbExpress是一个跨平台的、不依赖于数据库的一个独立的层。它提供了一些方法用于动态SQL的处理。它定义了一个接口用于访问不同的SQL 服务器,并为各种数据库提供了驱动程序。
这些驱动程序在Windows和Linux下都能使用(Windows下为动态连接库.DLL,而在Linux下为共享对象.so文件)。 这种API 驱动,减少了数据库引擎需要的额外开销。
标准的dbExpress数据库应用是不使用数据缓存的,由于保持核心运行时数据库访问层的简单和轻便。所以,dbExpress提供了高性能的数据库连接,运行速度很高。但是,不用数据缓存将无法修改数据,而且,指针的移动也是单向的。为了能够修改数据,dbExpress也提供了一种使用数据缓存的控件,当然这无疑也会影响到效率。
目前在dbExpress能够应用的数据库有Qracle、MySQL、DB2和InterBase,这里以InterBase 数据库为例。
一、单向的数据连接
实例数据库为Delphi提供的Employee.gdb。
1)加入 TSQLConnection
属性:
LoginPrompt=False 不用用户名和密码显示
DirverName=InterBase 驱动程序名
ConnectionName=IBLoca 默认数据库(Database.gdb)
Params 点对话框出现信息表,修改数据库的名字Employee.gdb
Connected=true 如果连接正确,将可以顺利的为true;
2)加入 TSQLDataset
属性:
SQLConnection=SQLConnection名字
CommandType=ctTable 用表名连接
CommandText=表名
Active=true 如果正确,将可以为true;
3)加入 TDataSource
属性:
DataSet=SQLDataSet名字
4)加入数据绑定控件,由于不用缓存,所以不能用DBGrid,这里只用简单的DBEdit。
注意属性:
DataSource=DataSource名字
DataField=字段名
5)注意,SQLDataset移动指针只有两个方法
SQLdataset1.Next;
SQLdataset1.First;
这就可以运行了。
二、可以修改的数据连接
做一个主从结构的数据显示,要求从表是可以修改的,而且要用DBGrid,所以,这里要用一个新的控件来联系:
TSQLClientDataSet
和TSQLDataset不同TSQLClientDataSet是使用数据缓冲区的,所以,用它连接数据源可以修改,也可以用DBGrid显示。
和上面方法相同,加入TSQLConnection作数剧源。
属性:
LoginPrompt=False 不用用户名和密码显示
DirverName=InterBase 驱动程序名
ConnectionName=IBLoca 默认数据库(Database.gdb)
Params 点对话框出现信息表,改数据库名:Employee.gdb
Connected=true 如果连接正确,将可以顺利的为true;
1)做主表
加入 TSQLDataset
属性:
SQLConnection=SQLConnection1
CommandType=ctTable 用表名连接
CommandText=PROJECT (这是在Employee.gdb内的一个表)
Active=true 如果正确,将可以为true;
加入 TDataSource
属性:
DataSet=SQLDataSet1
加入数据绑定控件两个DBEdit,显示字段分别为PROJ_ID和PROJ_NAME。
用同样的方法作两个指针移动的Button。
2)做从表
加入TSQLClientDataSet
属性:
SQLConnection=SQLConnection1
CommandType=ctTable 用表名连接
CommandText=PROJ_DEPT_BUDGET (这是在Employee.gdb内的另一个表)
Active=true (激活)
做主从连接
MasterSource=DataSource1
MasterFierds=PROJ_ID (连接字段)
加入 TDataSource
属性:
Name=DataSource2
DataSet=SQLClientDataSet1
加入DBGrid,与DataSource2连接。
这就完成了一个主从表制作,试验一下,可以发现从表是可以修改的。
仔细研究一下这个过程,归纳出设计的一般方法。一般来说,dbExpress主要在网络中使用,特别是后面将要提到的WebSnap 快速网络开发方法,将会给dbExpress 以很大的施展空间。