第一节 BDE、ADO、InterBase和dbExpress程序员
Delphi中处理数据库主要有两种方法,也就是BDE、ADO,从Delphi6.0开始还加入了一种dbExpress方法。 另外,Delphi还提供了专门处理Borland 公司本身的数据库产品InterBase 数据库的专门的方法。BDE(Borland Databas Engine), 是Delphi中最古老的技术,从delphi 2.0加入BDE 技术之后,一直是Delphi处理数据库的事实上的标
准。sql
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);app
文件名:=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 StandardAction 选择 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数据源的别名,其实是写入计算机的注册表的,因此若是但愿经过程序来设置别名,能够经过程序直接改写注册表来解决,具体请看实例。
1、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 数据库为例。
1、单向的数据链接
实例数据库为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;
这就能够运行了。
2、能够修改的数据链接
作一个主从结构的数据显示,要求从表是能够修改的,并且要用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主要在网络中使用