|
发表于 2004-4-23 23:34:09
|
显示全部楼层
说得有道理,我们正在写,请等待一段时间。我先贴出Justep文档组初步写出的一部分,请各位
(由于不知道怎样粘贴HTML格式文档,所以只好上传文件了。)
1.1. 数据相关类
1.1.1. TConnection(重点介绍)
当要对数据库操作时,第一步就是要与数据库建立连接。使用TConnection连接组件可以显示的与数据库建立连接关系。几个数据集可以分享同一个连接组件,也可以每个数据集使用它们自己的连接组件。
继承层次和类图:
Business.System.TObject
Business.System.TPersistent
Business.System.TComponent
Business.Data.TCustomConnection
Business.Data.TCustomRemoteServer
Business.Data.TConnection
命名空间:Business.Data.
1.1.1.1. 成员
公共构造函数
TConnection.Create 构造函数
初始化TConnection类的新实例。
公共属性
DataServer
获取数据服务器。
Meta
获取元对象。
ConnectionString
获取或设置连接字符串。
Transaction
获取或设置事务。
公共方法
GetServer
(返回接口,不介绍)
ApplyUpdates
(内部使用不介绍)将更新的数据应用到数据服务器中。返回错误数和不能更新的数据包。如果在调用之前未启动事务,则会在内部启动事务并提交更新的数据。
ExecuteSQL
已重载。执行SQL语句。返回影响的行数。
(参数:const SQLText: string)
ExecuteSQL
已重载。执行带参数的SQL语句。返回影响的行数。
(参数:const SQLText: string; var Params: OleVariant)
GetRecords
(内部使用不介绍)
GetParams
(内部使用不介绍)
CloseDataSets
(内部使用不介绍)
公共事件
OnCommit
未实现
OnRollBack
未实现
OnStartTransaction
未实现
1.1.1.2. 提示
ConnectionString(连接字符串)用于指定该连接所指向的数据库,其语法规则是:
'DATABASEURL=' + DatabaseURL
其中DatabaseURL为要连接的数据库URL。
例如,系统数据库的连接字符串为:
'DATABASEURL=Biz:\SYSTEM\System.DataBase'
Transaction属性是该连接所使用的事务。当连接(TConnection)被创建时,内部会生成一个默认的事务,也可以为连接指定其他的事务来控制对数据库的修改操作。
Meta属性可以获取到一个元对象,可以通过这个对象来获取数据库的相关信息,例如:数据库版本信息、数据表列表、存储过程列表、字段信息、索引信息等。
ExecuteSQL方法已重载,有两种调用方式:
· function ExecuteSQL(const SQLText: string): Integer; overload;
传入一个有效的SQL语句。如果成功执行,则返回所影响的行数,否则返回-1;
· function ExecuteSQL(const SQLText: string; var Params: OleVariant): Integer; overload;
传入一个有效的SQL语句以及SQL语句中所使用到的参数值。如果成功执行,则返回所影响的行数,否则返回-1;
通常不需要显示的创建连接组件,因为大多数业务数据集(例如:TSQLDataSet、TDecisionDataSet、TPivotDataSet、TStoredProcDataSet等)都支持隐式连接,只要使用其Database属性指定一个数据库引用,就可以在数据集内部生成一个数据库连接组件与数据库通讯。对于TQuery数据集则可以使用ConnectionString属性指明隐式连接。使用隐式连接时,不必显示的生成一个连接组件,这样能简化程序开发。
有些情况可能需要显示创建连接组件,例如:不通过数据集来执行SQL命令、为方便更换数据库连接而将多个数据集连接到同一个连接组件上等。
注意:使用TConnection组件连接到数据库时大多数情况都是属于“无状态”的连接,也就是说只用当真正对数据库操作(例如执行SQL语句、提交数据)时才建立连接,操作结束后马上断开连接;只有当起动立即事务后才会与数据库建立“有状态”的连接,直到立即事务提交或回滚后断开连接。
1.1.1.3. 示例
下面的示例根据系统数据库中的“文件系统表”和“连接参数表”获取系统中的数据库连接参数列表及其显示名称。将连接名称添加到FConnections字符串列表中,将连接字符串添加到FConnectionStrings字符串列表中。
procedure TMainForm.LoadConnections;
const
SQL = 'select a.FDISPLAYNAME, b.FPARAM from TFILESYSTEM a, TCONNECTION b ';
SQLOTHERS = SQL + 'where a.FSPACE + a.FID + a.FKIND = b.FBIZURL';
SQLORACLE = SQL + 'where a.FSPACE || a.FID || a.FKIND = b.FBIZURL';
var
Q: TQuery;
begin
try
Q := TQuery.Create(nil);
try
//为TQuery指定系统数据库连接
Q.ConnectionString := cSysDatabaseConnectionString;
//通过连接中的元对象判断连接数据库的类型,使用不同的SQL命令
if SameText(Q.Connection.Meta.DataProvider, 'ORACLE') then
Q.CommandText := SQLORACLE
else
Q.CommandText := SQLOTHERS;
Q.Open;
//遍历所有结果集,添加连接名称和连接字符串
while not Q.Eof do
begin
FConnections.Add(Q.Fields[0].AsString);
FConnectionStrings.Add(Q.Fields[1].AsString);
Q.Next;
end;
finally
Q.Free;
end;
except
end;
end;
使用的命名空间
Business.System, Business.Forms, Business.Data, Business.System.SysUtils,
Business.Model.BizObjConsts;
1.1.2. TTransaction(常规介绍)
事务是一组操作,是由一系列语句(选择、插入、更新或删除)构成的逻辑工作单元。这组操作在数据库中的一个或多个表被提交前必须都已成功执行。如果这组操作中有任何一个操作失败,所有的操作都将被回滚,不对数据库做任何修改。如果在事务执行过程中没有遇到错误,则事务中的所有修改会成为数据库的永久部分。
继承层次和类图:
Business.System.TObject
Business.System.TPersistent
Business.System.TComponent
Business.Data.TTransaction
命名空间:Business.Data.
1.1.2.1. 成员
公共构造函数
TTransaction.Create 构造函数
初始化TTransaction类的新实例。
公共属性
Active
获取是否已启动事务。
DataServer
获取数据服务器。
Immediate
获取是否是立即事务。
公共方法
Start
启动一个立即或非立即事务,返回事务句柄。
Commit
提交事务,要求传入事务句柄。
Rollback
回滚事务,要求传入事务句柄。
1.1.2.2. 提示
事务按照启动方式可以分为立即事务和非立即事务:
· 立即事务是在以立即方式启动事务后,数据库的事务也随之启动,直到该立即事务最后一次被提交或回滚,才结束数据库的事务;
· 非立即事务是在以非立即方式启动事务后,数据库的事务并不立即启动,从该事务启动到提交前的所有操作都保存到数据服务器中,直到最后一次被提交时,才真正启动数据库的事务并执行提交操作。
可以使用Start函数启动事务,其原型为function Start(AImmediate: Boolean): TTransactionHandle,要求传入一个布尔类型参数:True立即方式启动事务、False非立方式启动即事务。成功启动事务后,会返回一个事物句柄,句柄声明如下:
TTransactionHandle = record
Owner: TTransaction; //事务本身
ActiveCount: Integer; //该事务当前已经被启动的次数
end;
在事务提交和回滚时必须传入该事务启动后返回的事务句柄。
可以使用Commit(提交事务)和Rollback(回滚事务)方法结束事务。提交事务和回滚事务都必须在事务启动后才可以执行。
要在提交事务失败后回滚事务,可以写如下代码:
H := Transaction.Start(False); //启动事务
try
…… //执行操作
Transaction. Commit(H); //提交事务
except
Transaction.Rollback(H); //回滚事务,当执行操作失败或提交出错后执行
end;
不能在事务已经提交成功后再执行回滚操作,下面的代码就是错误的:
H := Transaction.Start(False); //启动事务
try
…… //执行操作
Transaction. Commit(H); //提交事务
finally
Transaction.Rollback(H); //错误,当提交成功后事务已结束,回滚则出错
end;
尽可能使事务保持简短很重要。保持简短以减少并发连接间的资源锁定争夺。在有少量用户的系统中,运行时间长、效率低的事务可能不会成为问题,但是在有上千个用户的系统中,将不能忍受这样的事务的。以下是编写有效事务的指导原则:
· 不要在事务处理期间要求用户输入
在事务启动之前,获得所有需要的用户输入。如果在事务处理期间还需要其它的用户输入,则回滚当前的事务,并在提供了用户输入之后重新启动该事务。即使用立即事务,作为人,其反应时间也要比计算机慢得多。事务占用的所有资源都要保持很长的时间,这就有可能造成阻塞问题。如果用户没有响应,该事务就会仍保持活动状态,并锁定关键资源,直到他们响应为止,但是用户可能会几分钟甚至几小时都不响应。
· 在浏览数据时,尽量不要打开事务
在所有预备的数据分析完成之前,不应启动事务。
· 保持事务尽可能的短
在知道了必须要进行的修改之后,启动事务,执行修改语句,然后立即提交或回滚。只有在需要时,才打开事务。
· 在事务中尽量使访问的数据量最小
这样可以减少锁定的行数,从而减少事务之间的争夺。
对数据库中的数据进行改动操作,必须包含在事务周期内。在一般情况下,是不需要写代码来显示的控制事务的启动和结束,因为通常情况下是通过数据集来修改数据库表中的数据,而数据集在执行提交(ApplyUpdates)时,会隐式启动一个非立即事务来将用户所修改的数据更新到数据库。
在某种特殊情况下,必须通过代码来控制事务的启动和结束,除了上述编写一个有效的事务原则外,还需要注意以下几点:
· 对于不同的事务之间可以嵌套或交叉的启动并结束立即或非立即事务
· 对于同一个事务,可以嵌套的启动并结束多次。注意:
1. 不能交叉启动并结束同一事务,可以根据事务句柄判断事务启动和结束的顺序,最晚开始的事务应该最早结束;
2. 非立即事务周期中不能包含立即事务周期;
· 事务的启动和结束必须是成对的出现,启动事务后必须有安全的结束事务操作
1.1.2.3. 示例
下面的示例根据SQL命令,在不改变数据库中数据的前提下判断该SQL命令是否返回游标。
function TMainForm.HasCursor(const ASQL, AConnectionStr: string): Boolean;
var
C: TConnection;
H: TTransactionHandle;
Q: TQuery;
begin
//创建连接组件
C := TConnection.Create(nil);
try
//为连接指定一个连接字符串
C.ConnectionString := AConnectionStr;
//以立即方式启动连接中默认的事务,并返回事务句柄
H := C.Transaction.Start(True);
try
//通过TQuery能否成功打开,来判断SQL命令是否返回游标
Q := TQuery.Create(nil);
try
//为TQuery指定连接组件
Q.Connection := C;
//为TQuery指定SQL命令
Q.CommandText := ASQL;
Q.DataFetch.PageRecords := 0;
Q.Open;
Result := True;
except
Result := False;
end;
finally
//由于不希望SQL命令改变数据库的数据,所以此处无论失败还是成功都将事务回滚
C.Transaction.Rollback(H);
end;
finally
C.Free;
end;
end;
使用的命名空间
Business.System, Business.Forms, Business.Data, Business.System.SysUtils;
1.1.3. TAggregate(常规介绍)
TAggregate用于描述一个可以在数据集中进行汇总计算的表达式。计算所依据的数据就是其所属数据集中的数据。
继承层次和类图:
Business.System.TObject
Business.System.TPersistent
Business.System.TCollectionItem
Business.Data.TBaseAggregate
Business.Data.TAggregate
命名空间:Business.Data.
1.1.3.1. 成员
公共构造函数
TAggregate.Create 构造函数
初始化TAggregate类的新实例。
公共属性
Expression
获取或设置统计表达式。
1.1.3.2. 提示
Expression属性需要为其指定一个汇总表达式字符串,表达式需要满足以下规则:
· 汇总表达式应由聚合函数、字段域、常量、表达式运算符组成,其中聚合函数是必须的,在下面的表格中列出可以使用的聚合函数:
聚合函数
描述
Sum
计算数字型字段或者表达式的合计值。
Avg
计算数字、日期时间型字段或表达式的平均值。
Count
指出字段或表达式的非空值的数目。
Min
指出字符串、数字、日期时间型字段或表达式的最小值。
Max
指出字符串、数字、日期时间型字段或表达式的最大值。
· 汇总表达式不能包含嵌套汇总操作,不能结合运算汇总值与字段值。这些规则在下面的例子中列出:
汇总表达式
描述
Sum(Field1)
合法的汇总字段
Sum(Field1*Field2)
合法的汇总字段表达式
Max(Field1)-Max(Field2)
合法的汇总表达式
Avg(Field1)*100
合法的汇总字段与常量的表达式
Min(Sum(Field1))
不合法的嵌套汇总
Count(Field1)-Field2
不合法的汇总与字段结合运算的表达式
· 表达式中所使用的字段名,必须是该表达式所属数据集中数据字段的字段名
TAggregate对象是不应该独立存在的,它的Collection属性必须指向一个TAggregates对象,且Collection.DataSet不为空。Collection.DataSet则是这个汇总表达式所属的数据集
计算汇总表达式的值,可以使用其所属数据集的CalcAggregate函数。在计算前数据集必需处于打开状态,因为汇总表达式的计算是依赖数据中的数据的。
也可以使用所属数据集的分组(TDataGroup)或分组节点(TDataGroupItem)中的CalcAggregate函数来计算汇总表达式的值。所计算的汇总数据则是以指定分组下的所有数据依据。
1.1.3.3. 示例
下面的示例根据……
procedure TMainForm.Sample;
begin
end;
使用的命名空间
Business.System, Business.Model, Business.Forms
1.1.4. TAggregates(常规介绍)
TAggregates类维护一个TAggregate类型对象的列表。它提供了对列表中的对象进行添加、删除、修改等维护操作的方法和属性。并为列表中的汇总表达式指定所属数据集。
继承层次和类图:
Business.System.TObject
Business.System.TPersistent
Business.System.TCollection
Business.System.TOwnedCollection
Business.Data.TAggregates
命名空间:Business.Data.
1.1.4.1. 成员
公共构造函数
TAggregates.Create 构造函数
初始化TAggregates类的新实例。
公共属性
DataSet
获取所属数据集。
Items
获取或设置TAggregate对象列表。
公共方法
Add
添加一个TAggregate对象到列表中。
1.1.4.2. 提示
TAggregates的构造函数的原形为constructor Create(ADataSet: TDataSet);需要传入所属的数据集,该数据集的作用是为列表中的TAggregate对象提供计算所依据的数据。
1.1.4.3. 示例
下面的示例根据……
procedure TMainForm.Sample;
begin
end;
使用的命名空间
Business.System, Business.Model, Business.Forms
1.1.5. TDataFetchItem(常规介绍)
TDataFetchItem是用于描述分组取数据方案中的一个分组节点对象。分组取数据方案是按照树型结构描述的。
继承层次和类图:
Business.System.TObject
Business.Data.BaseDataGroupItem
Business.Data.DataFetchItem
命名空间:Business.Data.
1.1.5.1. 成员
公共构造函数
TDataFetchItem.Create 构造函数
初始化TDataFetchItem类的新实例。
公共属性
FetchedRecordCount
获取已经取到的记录数。
FetchState
获取当前分组的已经取得数据的状态。(状态包括:未取、部分已取、已全取)
Group
获取所属的TDataFetch对象。
Parent
获取父分组节点对象。
Items
获取子分组节点对象列表。
公共方法
Find
查找该分组下的子分组节点对象,需要传入节点值。查找不到则返回空。
Get
获取该分组下的子分组节点,需要传入节点值。获取不到则报错。
GetRecords
获取分组后的记录。返回数据包。(内部)
Clear
复位。(内部)
Fetch
取该分组的一页数据。
FetchAll
取该分组的全部数据。
FetchFirst
取该分组的第一页数据
1.1.5.2. 提示
TDataFetchItem(分组节点)对象通常是不应该独立存在的,它的Group属性必须指向一个TDataGroup对象,且Group.DataSet不为空。Group.DataSet则是这个分组节点对象所属的数据集。
由于分组取数据方案是按照树型结构描述的,所以每个分组节点都有Parent(父节点)属性、Items(子节点列表)属性和KeyValue(节点值)属性。当分组节点的Parent属性为空、且KeyValue属性为未分配时,该节点为首节点。首节点的Items列表中的子节点值,对应着第一层分组字段的字段值。
使用Find和Get函数查找或获取节点对象时,需要传入节点值(KeyValue)。KeyValue是该节点所对应的分组字段的值。
不同的分组节点,对应着数据集中不同范围的记录。首节点所对应的记录是所属数据集应该获取到的所有记录。首节点的下一层节点,每个节点所对应的记录都满足第一层分组字段的字段值等于该节点值,已此类推。
分组节点对象获取数据有三种方法:
· Fetch 是获取当前分组下的一页数据,每页要获取的记录数是根据分组节点所属的分组取数据方案中的PageRecords属性来确定的;
· FetchAll 是获取当前分组下的所有数据;
· FetchFirst是获取当前分组下的第一页数据。如果该分组下已经获取了数据,则该操作不起任何作用。
1.1.5.3. 示例
下面的示例根据……
procedure TMainForm.Sample;
begin
end;
使用的命名空间
Business.System, Business.Model, Business.Forms
1.1.6. TDataFetch(常规介绍)
TDataFetch是按照树型结构描述分组取数据方案的类。在给定取数据方案中的分组字段和每页记录数后,所属数据集就会按照这种规则分层、分页的取数据。
继承层次和类图:
Business.System.TObject
Business.System.TPersistent
Business.Data.TBaseDataGroup
Business.Data.TDataFetch
Business.Data.TSQLDataFetch
命名空间:Business.Data.
1.1.6.1. 成员
公共构造函数
TDataFetch.Create 构造函数
初始化TDataFetch类的新实例。
公共属性
Current
获取或设置当前的分组。
CommandText
获取或设置SQL命令。
Params
获取或设置SQL命令中使用的参数列表。
Items
获取第一层分组节点对象。
KeyFieldNames
获取或设置分组取数据的分组字段。
PageRecords
获取或设置每页要取数据的记录数。
公共方法
GroupEnabled
获取是否能够分组取数据。(内部)
Enabled
获取是否能够分组取数据。(内部)
Find
查找所有分组节点中满足指定参数的分组节点对象。如果找不到则返回空。
Get
获取所有分组节点中满足指定参数的分组节点对象。如果找不到则报错。
CanFetch
获取是否能够取数据。
FetchState
获取指定分组节点已经取得数据的状态。
Fetch
获取当前分组或第一层分组的一页数据。
FetchAll
获取当前分组或第一层分组的所有数据。
公共事件
DataFetched
(内部接通知用)
1.1.6.2. 提示
Current属性是当前分组,也就是所属数据集当前的记录所对应的最后一层分组节点。
KeyFieldNames属性是以分号分隔的字段名列表,即分组字段列表。例如:
Name;Team
其中Name为第一层分组,Team为第二层分组。
PageRecords属性为分组取数据时每次所取的记录数。默认值为-1。
· PageRecords=-1则获取该分组下全部数据;
· PageRecords=0则不获取该分组下的数据;
· PageRecords>0则每次获取指定数量的记录数,如果将要获取的记录数小于该数量则获取剩下的全部数据。
使用Find和Get函数查找或获取与指定参数(KeyValues)所对应的分组对象。这个参数可以是一维变体数组,也可以单个变体数值。根据传入的参数和与分组字段列表的对应关系,找到指定的分组节点。
可以使用CanFetch函数来判断能否获取到数据。获取不到数据的原因可能是:
· 所属数据集的状态(State)不是浏览状态(dsBrowse);
· 该分组取数据方案不允许未激活,即Enabled属性为FALSE;
· 数据集内没有任何数据要取;
· 当前分组节点或第一层分组节点已经获取到了所需的全部的数据。
1.1.6.3. 示例
下面的示例根据……
procedure TMainForm.Sample;
begin
end;
使用的命名空间
Business.System, Business.Model, Business.Forms
1.1.7. TDataGroupItem(常规介绍)
TDataGroupItem是用于描述分组中的一个分组对象节点。分组是按照树型结构描述的。
继承层次和类图:
Business.System.TObject
Business.Data.TBaseDataGroupItem
Business.Data.TDataGroupItem
命名空间:Business.Data.
1.1.7.1. 成员
公共构造函数
TDataGroupItem.Create 构造函数
初始化TDataGroupItem类的新实例。
公共属性
Group
获取所属的TDataGroup对象。
Items
获取子分组节点对象列表。
Parent
获取父分组节点对象。
RecordCount
获取该分组的记录个数。
Text
获取当前节点的显示名称。
MDKeyValues
(内部)
公共方法
CalcAggregate
计算在该分组的数据范围内汇总表达式的值。
Find
查找该分组下的子分组节点对象,需要传入节点值。查找不到则返回空。
Get
获取该分组下的子分组节点,需要传入节点值。获取不到则报错。
Clear
(内部)
Fetch
取该分组的第一页数据。(内部)
ResetAggregates
(内部)
1.1.7.2. 提示
TDataGroupItem(分组节点)对象通常是不应该独立存在的,它的Group属性必须指向一个TDataGroup对象,且Group.DataSet不为空。Group.DataSet则是这个分组节点对象所属的数据集。
由于分组是按照树型结构描述的,所以每个分组节点都有Parent(父节点)属性、Items(子节点列表)属性和KeyValue(节点值)属性。当分组节点的Parent属性为空、且KeyValue属性为未分配时,该节点为首节点。首节点的Items列表中的子节点值,对应着第一层分组字段的字段值。
使用Find和Get函数查找或获取节点对象时,需要传入节点值(KeyValue)。KeyValue是该节点所对应的分组字段的值。
不同的分组节点,对应着数据集中不同范围的记录。首节点所对应的记录是所属数据集应该获取到的所有记录。首节点的下一层节点,每个节点所对应的记录都满足第一层分组字段的字段值等于该节点值,已此类推。
Text属性是该分组所对应的字段的显示名称。
CalcAggregate函数是提供获取指定汇总表达式对该分组的数据的汇总值。
1.1.7.3. 示例
下面的示例根据……
procedure TMainForm.Sample;
begin
end;
使用的命名空间
Business.System, Business.Model, Business.Forms
1.1.8. TDataGroup(常规介绍)
TDataFetch是按照树型结构描述分组的类。在给定分组中的分组字段后,所属数据集的表现组件就会按照这种规则进行分组表现和分组统计的依据。
继承层次和类图:
Business.System.TObject
Business.System.TPersistent
Business.Data.TBaseDataGroup
Business.Data.TDataGroup
命名空间:Business.Data.
1.1.8.1. 成员
公共构造函数
TDataGroup.Create 构造函数
初始化TDataGroup类的新实例。
公共属性
Current
获取或设置当前的分组。
Items
获取第一层分组节点的对象。
KeyFieldNames
获取或设置分组的分组字段。
公共方法
CalcAggregate
计算指定分组节点的汇总表达式的值。
Find
查找所有分组节点中满足指定参数的分组节点对象。如果找不到则返回空。
Get
获取所有分组节点中满足指定参数的分组节点对象。如果找不到则报错。
Reset
(内部)
ResetAggregates
(内部)
1.1.8.2. 提示
Current属性是当前分组,也就是所属数据集当前的记录所对应的最后一层分组节点。
KeyFieldNames属性是以分号分隔的字段名列表,即分组字段列表。例如:
Name;Team
其中Name为第一层分组,Team为第二层分组。
使用Find和Get函数查找或获取与指定参数(KeyValues)所对应的分组对象。这个参数可以是一维变体数组,也可以单个变体数值。根据传入的参数和与分组字段列表的对应关系,找到指定的分组节点。
CalcAggregate函数是提供获取指定汇总表达式对指定分组节点对象所包括的数据的汇总值。函数原型为
function CalcAggregate(Aggregate: TBaseAggregate; const KeyValues: Variant): Variant;
Aggregate参数需要传入分组表达式的描述类,用于汇总计算
KeyValues参数需要传入要汇总的分组节点的值或值数组,其定位方法与Find和Get相同。
1.1.8.3. 示例
下面的示例根据……
procedure TMainForm.Sample;
begin
end;
使用的命名空间
Business.System, Business.Model, Business.Forms
1.1.9. TDataSetRelation(重点介绍)
TDataSetRelatio是用于描述所属数据集(从数据集)与主数据集之间的关联关系。可以指定与主数据集的关联字段、是否自动打开主数据集、从数据集取数据的方案、是否级联更新、是否级联删除等设置。
继承层次和类图:
Business.System.TObject
Business.System.TPersistent
Business.Data.TDataSetRelation
命名空间:Business.Data.
1.1.9.1. 成员
公共构造函数
TDataSetRelation.Create 构造函数
初始化TDataSetRelation类的新实例。
公共属性
KeyFieldNames
获取或设置从表关连字段列表。
MasterFieldNames
获取或设置主表关连字段列表。
Master
获取或设置主数据集。
AutoOpenMaster
获取或设置是否自动打开主表。
FetchMode
获取或设置取数据模式。(包括:需要时取、全取)。
DeleteRule
获取或设置删除模式。(包括:不级联、级联、设空值)。
UpdateRule
获取或设置更新模式。(包括:不级联、级联、设空值)
公共方法
CanActive
(可能内部使用)
Active
(可能内部使用)
1.1.9.2. 提示
KeyFieldNames和MasterFieldNames属性用于描述从数据集与主数据集之间的关联关系。两个列表必须保证一一对应关系,其中KeyFieldNames保存的是其所属数据集(从数据集)中的字段名列表,MasterFieldNames保存的则是主数据集中的字段名列表。
可以通过设置AutoOpenMaster属性为True,而使所属数据集(从数据集)在打开时确保主数据集处于打开状态,如果主数据集已经打开则不会再重新打开主数据集。如果AutoOpenMaster属性为False时,所属数据集打开时则不会去管主数据集是否打开,从数据集打开后而主数据集没有打开时从数据集是没有数据的。
可以通过设置FetchMode属性设置从数据集取数据的模式。分为需要时取和全取:
· 需要时取:当主数据集滚动后,从数据集需要显示与主数据集关联字段所对应的记录,需要时取是当从数据集需要显示哪些数据就去取哪些数据记录;
· 全取:从表在打开后会获取其所需的所有数据。
DeleteRule和UpdateRule是设置主从及联删除和及联更新。有三个选项:
· 不做及联:当主数据集删除或更新记录时,从数据集不会有任何数据上的变动;
· 及联:当主数据集删除或更新记录时,从数据集的关联记录也随之删除或更改关联字段值;
· 设置空值:当主数据集删除或更新记录时,从数据集的关联记录的关联字段值设置为空。
从表插入一条记录,其关联字段会自动的填入主表关联字段值;
1.1.9.3. 示例
下面的示例根据……
procedure TMainForm.Sample;
begin
end;
使用的命名空间
Business.System, Business.Model, Business.Forms
1.1.10. TDataSet(重点介绍)
TDataSet是系统中所有数据集的基类,它抽取了数据集应该具有的所有共性。一般来说,不应该直接使用TDataSet类来创建实例,应该使用从它继承的子类,例如TQuery、TSQLDataSet等。
继承层次和类图:
Business.System.TObject
Business.System.TPersistent
Business.System.TComponent
Business.Data.TCustomClientDataSet
Business.Data.DataSet
Business.Data.TCloneDataSet
Business.Data.TQuery
Business.Model.TBizDataSet
命名空间:Business.Data.
1.1.10.1. 成员
公共构造函数
TDataSet.Create 构造函数
初始化TDataSet类的新实例。
公共属性
Aggregates
获取或设置汇总表达式列表。
Connection
获取或设置连接组件。
ConnectionString
获取或设置连接字符串。
Details[]
获取从数据集列表。
DetailCount
获取从数据集个数。
Kind
获取数据集类型。(可能需要去掉)
Params
获取或设置参数列表。
UpdatesPending
获取是否需要提交。
Constraints
获取或设置约束检查。
Relation
获取或设置主从关系。
Order
获取或设置排序。
DataFetch
获取或设置取数据方案。
Group
获取或设置分组。
UpdateOptions
获取或设置更新选项。
Filter
获取或设置过滤条件。
Filtered
获取或设置过滤开关。
ReadOnly
获取或设置数据集只读。
公共方法
CalcAggregate
计算汇总表达式。
GetFieldData
已重写。获取当前记录的字段值,返回是否成功获取。(参数:Field: TField; Buffer: Pointer)
GetFieldData
已重写。获取当前记录的字段值,返回是否成功获取。(参数:FieldNo: Integer; Buffer: Pointer)
GetValue
已重载。获取当前记录中给定字段列表的值或值列表。(参数:Fields: TList)
GetValue
已重载。获取当前记录中给定字段列表的值或值列表。(参数:const FieldNames: string)
Locate
已重写。定位当前记录为指定字段的值所对应的记录,返回是否定位成功。
IsFixedCharField
(内部)
GetFieldValue
(内部)
FindKeyByVar
(内部)定位当前记录为与Order属性匹配的值所对应的记录。
CanOrder
(内部)判断给定排序是否与当前排序兼容。
LockOrder
(内部)锁定给定的排序。返回锁定句柄。
UnlockOrder
(内部)根据锁定句柄为排序解锁。
ApplyUpdates
已重写,已重载。提交修改数据,返回提交出错的记录。(参数:MaxErrors: Integer)
ApplyUpdates
已重载。提交更新的数据。(参数:Cascade: Boolean)
ApplyUpdates
已重载。级联提交更新的数据。(参数:无)
Cancel
撤销当前编辑状态的修改。
UpdateInternalFilter
(内部)更新内部过滤。
CancelUpdates
已重载。撤销所有未提交的修改数据。(参数:无)
CancelUpdates
已重载。撤销所有未提交的修改数据。(参数:Cascade: Boolean)
EnumDataLinkInterface
(内部)
BeginTempBuffer
(内部)
EndTempBuffer
(内部)
UpdateTempCalcFields
(内部)
CanEdit
判断是否能够进行编辑操作。
CanDelete
判断是否能够进行删除操作。
CanInsert
判断是否能够进行插入操作。
CheckConstraints
检查当前记录的修改是否违反约束。
公共事件
BeforeOpenEvents
(用户可能会使用,但不介绍)
AfterOpenEvents
(用户可能会使用,但不介绍)
BeforeCloseEvents
(用户可能会使用,但不介绍)
AfterCloseEvents
(用户可能会使用,但不介绍)
BeforeInsertEvents
(用户可能会使用,但不介绍)
AfterInsertEvents
(用户可能会使用,但不介绍)
BeforeEditEvents
(用户可能会使用,但不介绍)
AfterEditEvents
(用户可能会使用,但不介绍)
BeforePostEvents
(用户可能会使用,但不介绍)
AfterPostEvents
(用户可能会使用,但不介绍)
BeforeCancelEvents
(用户可能会使用,但不介绍)
AfterCancelEvents
(用户可能会使用,但不介绍)
BeforeDeleteEvents
(用户可能会使用,但不介绍)
AfterDeleteEvents
(用户可能会使用,但不介绍)
BeforeScrollEvents
(用户可能会使用,但不介绍)
AfterScrollEvents
(用户可能会使用,但不介绍)
BeforeRefreshEvents
(用户可能会使用,但不介绍)
AfterRefreshEvents
(用户可能会使用,但不介绍)
OnCalcFieldsEvents
(用户可能会使用,但不介绍)
OnDataSetChangeEvents
(用户可能会使用,但不介绍)
OnNewRecordEvents
(用户可能会使用,但不介绍)
OnFilterRecordEvents
(用户可能会使用,但不介绍)
BeforeApplyUpdatesEvents
(用户可能会使用,但不介绍)
AfterApplyUpdatesEvents
(用户可能会使用,但不介绍)
GroupItemDeleteRecordEvents
(用户可能会使用,但不介绍)
GroupItemInsertRecordEvents
(用户可能会使用,但不介绍)
BeforeOpen
数据集打开前发生。
AfterOpen
数据集打开后发生。
BeforeClose
数据集关闭前发生。
AfterClose
数据集关闭后发生。
BeforeInsert
插入记录前发生。
AfterInsert
插入记录后发生。
BeforeEdit
当前记录处于编辑状态前发生。
AfterEdit
当前记录处于编辑状态后发生。
BeforePost
保存当前编辑记录更改前发生。
AfterPost
保存当前编辑记录更改后发生。
BeforeCancel
撤销当前编辑记录更改前发生。
AfterCancel
撤销当前编辑记录更改后发生。
BeforeDelete
删除当前记录前发生。
AfterDelete
删除当前记录后发生。
BeforeScroll
记录滚动前发生。
AfterScroll
记录滚动后发生。
BeforeRefresh
数据集刷新前发生。
AfterRefresh
数据集刷新后发生。
OnCalcFields
当计算字段需要重新计算时发生。
OnDataSetChange
当数据集发生改变时发生。
OnNewRecord
当插入或添加一条新记录时发生。
OnFilterRecord
当数据集加载每一条记录时发生。
AfterApplyUpdates
数据集提交修改数据前发生。
BeforeApplyUpdates
数据集提交修改数据后发生。
1.1.10.2. 提示
数据集要处理数据库中的数据,首先要与数据库建立连接关系。Connection和ConnectionString就是数据集与数据库建立连接关系的两种方式,可以使用其中的任意一种。与数据库建立连接必须使用连接组件(TConnection)。Connection属性就是为数据集指定一个外部的已存在的连接组件;ConnectionString属性则是为数据集指定一个连接字符串,数据集会在内部根据这个连接字符串创建一个自己的连接组件,与数据库建立连接关系。
Order属性用来控制数据集中记录的排列顺序,可以指定某个字段升/降序。设置Order属性的语法规则:
字段名1[ DESC], 字段名2[ DESC],……,字段名N[ DESC]
例如:
Name,Age DESC,Team
其中Name和Team字段按升序排列、Age字段按降序排列,排列的先后顺序是Name、Age、Team
使用Order排序时还要注意以下几点:
· 如果某个字段按照升序排列且字段中包含空值,则空值排列在前面;
· 如果不设置Order,则记录的顺序按照数据库返回的查询结果顺序一致;
· 数据集的Order属性与SQL命令中的ORDER BY是有区别的。两个同时使用时,以数据集的Order属性为准。而SQL命令中的ORDER BY是完全依赖不同类型数据库返回的结果,如果是ORACLE数据库则按升序排列时非空值排到前面,如果是SQLServer、Sybase等则空值排列在前面。
Locate函数用于定位当前记录。其原型为function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean;
KeyFields和KeyValues属性分别是字段名列表和所对应的字段值。
Options是定位参数,包括不区分大小写(loCaseInsensitive)和部分匹配(loPartialKey)。
如果找到了指定的记录,则该记录成为当前记录并且返回值为True,否则当前记录不改变且返回值为False。
可以使用Group属性对数据集的数据进行分组。分组的作用主要是提供给支持分组的数据感知组件(TDataGrid组件)进行分组表现,和分组汇总(CalcAggregate函数)使用。Group属性需要设置其KeyFieldNames(分组字段)属性,该属性是以分号分隔的字段名列表,例如:Name;Team 。详细说明可以参考TDataGroup类描述。另外还要注意的是,如果分组表现组件改变了分组状态,数据集的分组属性也会随之变化。
可以使用DataFetch 属性设置数据集按照分组来取数据的方案。需要设置其KeyFieldNames(分组字段)属性和PageRecords(每页记录数)属性。详细说明可以参考TDataFetch类描述。设置数据集的分组取数据方案需要注意以下几点:
· DataFetch属性的获取数据方法(Fetch、FetchAll等)是使用者或表现组件主动触发的。当设置了分组取数据方案的数据集打开后,并没有外界触发取数据方法,则数据集中是没有记录的;
· Group和DataFetch属性同时设置时,分组字段的顺序必须一致,否则在设置属性时会报错,以下面的例子来说明:
Group.KeyFieldNames
GroupedFatch.KeyFieldNames
合法性
‘NAME;TEAM;AGE’
‘NAME;TEAM;AGE’
正确
‘NAME;TEAM
‘NAME;TEAM;AGE’
正确
‘NAME;TEAM;AGE’
‘TEAM;AGE’
错误
‘NAME;TEAM
‘TEAM;AGE’
错误
‘ NAME;TEAM ‘
‘’
正确
‘’
‘NAME;TEAM ‘
正确
‘TEAM;NAME;AGE’
‘NAME;AGE;TEAM
错误
‘NAME;TEAM;AGE’
‘AGE;NAME’
错误
可以使用Aggregates属性和CalcAggregate函数配合来计算数据集中数据的汇总值。Aggregates属性保存的是汇总表达式的列表,详细的描述可以参考TAggregates类。CalcAggregate函数是用来计算单个汇总表达式的值,其原型为:function CalcAggregate(Aggregate: TBaseAggregate; GroupingLevel: Integer): Variant;
Aggregate参数传入汇总表达式列表中的某个汇总表达式描述;
GroupingLevel参数传入分组的级别。当为-1时,汇总数据的范围是当前记录所对应的最后一层分组下的记录,如果没有分组则范围是全部记录;当为0时,汇总数据的范围是全部记录;当大于0时且小于等于分组字段个数时,则范围是当前记录所在的该分组级别下的全部记录;当大于分组字段个数时,则与-1时相同。
如果两个数据集需要建立主从关系,可以设置从数据集的Relation属性。Relation属性中需要指明它的主数据集、关联字段列表、取数据方案、级联更新、级联删除等设置。设置主从关系需要注意一下几点:
· 一个从数据集只能对应一个主数据集;
· 一个主数据集可以有多个从数据集与其关联。可以使用主数据集的DetailCount和Details属性获取属于这个数据集的从数据集个数和每个从数据集;
· 一个主数据集下的从数据集,又可以作为其它数据集的主数据集。但这种关系不能产生循环;
· TDataSet提供了“级联提交”和“级联撤销”的方法。在具有主从关系的数据集中,只要提交其中一个被修改的数据集,与其关联的主数据集和从数据集也都会自动提交。
1.1.10.3. 示例
下面的示例根据……
procedure TMainForm.Sample;
begin
end;
使用的命名空间
Business.System, Business.Model, Business.Forms
1.1.11. TCloneDataSet(常规介绍)
TCloneDataSet是用于克隆一个原数据集,被克隆出来的数据集分享原始数据的数据,而不是复制所有原始数据的数据到克隆数据集中。
继承层次和类图:
Business.System.TObject
Business.System.TPersistent
Business.System.TComponent
Business.Data.TCustomClientDataSet
Business.Data.DataSet
Business.Data.TCloneDataSet
命名空间:Business.Data.
1.1.11.1. 成员
公共构造函数
TCloneDataSet.Create 构造函数
初始化TCloneDataSet类的新实例。
公共方法
CloneCursor
克隆指定的原数据集。
InternalOpen
已重写。内部打开数据集。
1.1.11.2. 提示
由于克隆出来的数据集分享原始数据集的数据,所以克隆数据集不能在不影响原数据集的情况下修改数据,也就是说对克隆所做的删除、插入、修改等对数据的更改操作也同样会反映到原始的数据集上。
创建克隆数据集后,需要使用CloneCursor方法克隆指定的数据集。其原型为:
procedure CloneCursor(Source: TDataSet; KeepRelation: Boolean; Reset: Boolean; KeepSettings: Boolean);
Source参数需要传入被克隆的原数据集;
KeepRelation参数决定克隆数据集是否克隆原始数据集的主从关系;
Reset和KeepSettings参数决定克隆数据集中的一些属性和事件的状态,这些属性和事件包括:Filtered、Filter、OnFilterRecord、Order、ReadOnly等;
当Reset和KeepSettings参数都为False时,这些属性和事件都保持克隆数据集自己原有的状态
当Reset为True时,所有这些属性和事件都会被置为初始值
当Reset为False且KeepSettings为True时,使克隆数据集这些属性、事件都与原始数据集的状态保持一致。
当需要遍历原始数据集来获取一些数据时,而又不想让数据集滚动,因为滚动原始数据集会影响到从数据集取数据或其表现组件的表现,这种情况下就可以使用克隆数据集来克隆一个和原始数据集一样的数据集,滚动克隆出来的数据集不会影响原始数据集当前记录、排序、本地过滤等状态。
当克隆一个原始数据集后,克隆数据集的当前记录和原始数据集的当前记录一致。
1.1.11.3. 示例
下面的示例根据……
procedure TMainForm.Sample;
begin
end;
使用的命名空间
Business.System, Business.Model, Business.Forms
1.1.12. TDeltaDataSet(常规介绍)
TDeltaDataSet是用来更方便的分析数据集中的Delta(数据集的修改日志)。通常会使用TDeltaDataSet来遍历修改日志,以便获取需要做记录的数据。
继承层次和类图:
Business.System.TObject
Business.System.TPersistent
Business.System.TComponent
Business.Data.TCustomClientDataSet
Business.Data.TPacketDataSet
Business.Data.TDeltaDataSet
命名空间:Business.Data.
1.1.12.1. 成员
公共构造函数
TDeltaDataSet.Create 构造函数
初始化TDeltaDataSet类的新实例。
公共方法
FieldModified
获取当前记录中指定字段是否被修改。
NextStatus
移动到下一个位置。
1.1.12.2. 提示
Create方法的原型为constructor Create(ADataSet: TDataSet);需要传入一个被分析的数据集,TDeltaDataSet会将被分析的数据集的修改日志(Delta)变为自己的数据(Data),以便对该数据集的修改日志进行分析。
可以使用FieldModified函数来判断TDeltaDataSet数据集的当前记录(也就是数据集的修改日志记录)的指定字段值是否被修改。
NextStatus方法将TDeltaDataSet数据集的当前记录移动到下一个位置。
1.1.12.3. 示例
下面的示例根据……
procedure TMainForm.Sample;
begin
end;
使用的命名空间
Business.System, Business.Model, Business.Forms
1.1.13. TQuery(常规介绍)
TQuery是直接从TDataSet继承而来,具有最基本的数据集特性。一般使用TQuery来进行业务无关的处理数据操作。
继承层次和类图:
Business.System.TObject
Business.System.TPersistent
Business.System.TComponent
Business.Data.TCustomClientDataSet
Business.Data.TDataSet
Business.Data.TQuery
命名空间:Business.Data.
1.1.13.1. 成员
公共构造函数
TQuery.Create 构造函数
初始化TQuery类的新实例。
公共属性
CommandText
获取或设置SQL命令。
1.1.13.2. 提示
CommandText属性是数据集到服务端取数据的SQL命令。在TQuery打开之前该属性不能为空。
通常使用TQuery来做与业务层面无关的数据处理操作。例如获取系统中使用的数据库连接列表、获取某张表的记录数等。
1.1.13.3. 示例
下面的示例根据……
procedure TMainForm.Sample;
begin
end;
使用的命名空间
Business.System, Business.Model, Business.Forms |
|