Delphi数据库处理


======================================================
注:本文源代码点此下载
======================================================

delphi数据库处理

第一节 bde、ado、interbase和dbexpress

delphi中处理数据库主要有两种方法,也就是bde、ado,从delphi 6.0开始还加入了一种dbexpress方法。 另外,delphi还提供了专门处理borland 公司自己的数据库产品interbase 数据库的专门的方法。

bde(borland databas engine), 是delphi中最古老的技术,从delphi 2.0加入bde 技术以后,一直是delphi处理数据库的事实上的标准。bde 是一个基于驱动程序的体系结构,每一种数据格式或数据源都有一种驱动程序来驱动相近的数据源。bde 可以很好的支持现在最流行的odbc api方法,odbc是一种c/c++ 应用程序编程接口(api ),无论是对任何一种客户/ 服务器关系型数据库管理系统(rdbms ),还是最流行索引顺序访问方法(isam)数据库(jet、foxpro), 都能很好的访问。

同时,由于bde 的驱动程序主要直接来自于第三方开发商,所以,对于像oracle这些非微软的数据库,执行效率上比较高。正是这些特点,使bde 技术还是得到了很多数据库开发程序员的欢迎。

ado 技术是微软提出来的处理关系型数据库和非关系型数据库的新技术,它基于微软被称为ole db的数据访问模式,它是专门为了给大范围商业数据源提供访问而设计的,包括传统的关系型数据表、电子邮件系统、图形格式、internet资源等。ado 所需内存更少,更适合大流量和大事务量的网络计算机系统。

ado 顶层有三个对象:connection、command、recordset。

connection用以指定数据源,建立和数据源的连接。

command 对象用以对数剧源执行指定的命令,可以接受sql 语句,表和存储过程的名称,执行sql 查询,更新数据,插入纪录等。

recordset 对象表示的是来自表或命令执行结果的记录全集,操纵来自提供者的几乎所有数据。

由于ado 技术的迅速普及,从delphi 5.0开始,加入了ado 技术的模块,并逐步成为delphi数据库设计的主流。但是,和vb的adodc 相比,它还是有所不同的,在数据绑定上,它更多的吸收了bde 的特点,以做到和原来的程序兼容,同时,它又可以接受标准ado 技术的各种属

性和方法,在接受这些属性和方法时,它是和数据绑定控件脱离的,当然从某种意义上来说,这种方案提高了执行效率,给设计人员以更多的选择。

dbexpress 是delphi 6.0加入的最新的数据库模块,它不使用缓存,可以快速浏览大量的数据,但是,不使用缓存就不能更改,所以它的标准方式是只读的。它一个重要的特点是交叉平台,可以和linux 数据库连接,速度相当快。

下面的讨论,将以ado 技术为主线,最后再说明bde 和dbexpress的应用方式。

第二节ado 面板的主要组件

ado 面板一共有7 个组件:

adoconnection: 主要用于建立数据库的连接;

adodataset:ado 提取和操作数据库的主要数据集,可以直接连接到数据库,也可以通过 adoconnection连接到数据库。

adotable:主要用以操作和提取单个基表的数据,可以直接连接到数据库,也可以通过 adoconnection连接到数据库。

adoquery:通过sql 语言提取数据,其连接数据库的方式和前两种一样。

adostoredproc: 这个组件专门用于运行数据库中的存储过程。

adocommand:该组件用于运行一些sql 命令,这个组件可以和支持数据集的组件一起使用,也可以直接从一个基表中提取一个数据集。

rdsconnection: 一个进程或一台计算机传递到另一个进程或计算机的数据集合。

为了连接数据绑定控件,上述组件往往要和处于data access 中的datasource配合使用。

可以看出,和vb的adodc 不同的,delphi中解决同一个问题提供了多种方案,看起来似乎增加了麻烦,但是却可以给程序员更大的自由空间,便于设计出高效率的数据库程序来。

下面通过几个例子来说明ado 控件的用法。

第三节 adotable组件

adotable、adodataset、adoquery和adostoredproc都继承同一个父类tcustomadodataset,所以,在属性事件和方法上有很多相似的地方,但它主要是针对数据库中的表进行操作。

ado -〉adotable

属性:

name='控件名'

connectionstring='连接字符串'

可以通过点击右边的按钮,通过向导建立数据源。有时候需要知道相对路径,可以用下面的方法找到程序当前的路径:

tpath:=extractfilepath(application.exename);

文件名:=tpath+'..\data\test.mdb'

表明数据库在当前程序上一层的data文件夹下。

tablename='表名'

active=true

这就激活了数据源,为了和绑定控件联系,要增加一个dadasource控件。事实上,所有的绑定控件都是和dadasource联系。

data access-〉dadasource

属性:

dataset=adotable.name

加入绑定控件:

data controls-〉

dbgrid(表格)

属性

dadasource='dadasource.name'

dbnavigator(导航条)

属性

dadasource='dadasource.name'

运行一下可以看出关系

下面介绍一下adotable的一些重要的方法,这些方法大部分和table是兼容的。

为了便于叙述,adotable控件的name定为 adotable1

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 以很大的施展空间。


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值