delphi操作数据库快速编程

第一节 BDE、ADO、InterBase和dbExpress

       Delphi中处理数据库主要有两种方法,也就是BDE、ADO,从Delphi6.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 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数据源的别名,实际上是写入计算机的注册表的,所以如果希望通过程序来设置别名,可以通过程序直接改写注册表来解决,具体请看实例。

一、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主要在网络中使用

你可能感兴趣的:(数据库,Delphi)