用到多少写多少,以后的慢慢加上去吧
TClientDataSet也是从TDataSet继承下来的,它通常用于多层体系结构的客户端,所以,凡是其他数据集构件支持的功能;
不同的是,TClientDataSet能够在内存中建立数据的副本,因此,TClientDataSet比其他数据集构件增加了一些特殊的功能。区别:
1.
TClientDataSet.Data { 数据的二进制格式的描述 }
TClientDataSet.XMLData { 数据的 XML 格式的描述 }
.由于TClientDataSet并不直接连接数据库,因此,客户程序必须提供获取数据的机制。TClientDataSet有三种途径获取数据:
.从文件中存取数据。(.LoadFromFile,.xmldata,.FileName,或者通过IProvider读取文件,反正就是XML格式的数据)
.从本地的另一个数据集中获取数据。
.通过IProvider接口从远程数据库服务器获取数据。
.
1.1浏览数据,在运行期,可以调用诸如First、GotoKey、Last、Next和Prior等函数来浏览数据
对于TClientDataSet构件来说,还可以写RecNo属性,使某一序号的记录成为当前记录。
1.2CanModify属性(用于判断数据集中的数据是否可以修改)
与其他数据集构件不同,修改TClientDataSet构件的ReadOnly属性时,不需要事先把Active属性设为True。
1.3取消修改
UndoLastChange(FollowChange)--要取消上一次的修改
ChangeCount---返回日志中记载的修改次数(可以通过这个判断Delta是否为空)
RevertRecord---将从日志中取消所有对当前记录的修改。
LogChanges--False,用户对数据的修改就会直接反映到Data属性中。
CancelUpdates--将把日志清空,取消所有的修改。
SavePoint--它能把当前的编辑状态保存起来,以后随时可以返回当时的状态
{BeforeChanges := ClientDataSet1.SavePoint;
以后,可以这样来恢复当时的状态:
ClientDataSet1.SavePoint := BeforeChanges;}
1.4 合并修改
要把日志中记载的修改合并到Data属性中,有两种方式,具体使用哪一种方式,取决于应用程序获取数据的机制。不过,不管是哪种机制,合并后,日志自动被清空。
对于一个从文件中获取数据的程序来说,只要调用MergeChangeLog函数,就把日志中记载的修改合并到Data属性中。不用担心其他用户同时修改了数据。
对于一个从应用服务器获取数据的程序来说,就不能调用MergeChangeLog来合并数据,而要调用ApplyUpdates函数,ApplyUpdates会把日志中记载的修改传递给应用服务器,待应用服务器成功地把数据更新了数据库服务器后,才会合并到Data属性中
1.5 纠错
TClientDataSet支持纠错功能。一般情况下,需要自己建立纠错规则,以便对用户输入的数据进行纠错。
此外,如果获得了IProvider接口的话,还可以从远程服务器引入纠错规则。
有时候,客户端可能需要暂时禁止纠错,因为客户端从应用服务器检索数据是分阶段进行的,在所有的数据检索完毕之前,有些纠错规则很可能会报错。
要暂时禁止纠错,可以调用DisableConstraints,要重新允许纠错,可以调用EnableConstraints函数。DisableConstraints和EnableConstraints实际上都是作用于一个内部的计数。
1.6 索 引
使用索引有这么几个好处:
.在数据集中定位记录比较快。
.能够在两个数据集之间建立Lookup或Master/Detail关系。
.可以对记录排序。
在多层体系结构中,当客户程序从应用服务器检索数据时,它同时获得了默认的索引。默认的索引叫DEFAULT_ORDER,可以使用这个索引排序,但不能修改或删除这个索引。
除了默认的索引外,TClientDataSet还对日志中记载的记录自动建立了一个副索引叫CHANGEINDEX。与DEFAULT_ORDER一样,不能修改或删除这个副索引。
另外,还可以使用数据集中已建立的其他索引,或者自己建立索引。
创建一个新的索引
要创建一个新的索引,可以调用AddIndex。AddIndex需要传递若干个参数:
一是Name参数,用于指定索引名。在运行期切换索引时需要用到索引的名称。
二是Fields参数,它是一个字符串,用于指定索引中的字段名,彼此之间用分号隔开。
三是Options参数,用于设置索引的选项,包含ixDescending元素表示按降序排列,包含ixCaseInsensitive元素表示大小写不敏感。
四是DescFields参数,它也是一个字符串,用于指定若干个字段名,这些字段将按照降序排列。
五是CaseInsFields参数,它的作用与DescFields参数类似,包含在CaseInsFields参数中的字段将对大小写不敏感。
六是GroupingLevel参数,用于指定分组级别,其值不能超过索引中的字段数。
下面的代码创建了一个索引:
If Edit1.Text <> \'\' and ClientDataSet1.Fields.FindField(Edit1.Text) then
Begin
ClientDataSet1.AddIndex(Edit1.Text+\'Index\',Edit1.Text,
[ixCaseInsensitive],\'\',\'\',0);
ClientDataSet1.IndexName := Edit1.Text + \'Index\';
End;
为了避免创建一个索引,可以临时用IndexFieldNames属性来指定若干个字段,让数据集按这些字段排序。
1.7 State属性
State属性是只读的,下面列出了State属性可能的值:
.dsInactive 数据集已关闭,不能访问它的数据;
.dsBrowse 数据集已打开,可以浏览数据但不能修改数据;
.dsEdit 此时为编辑状态,可以修改数据;
.dsInsert 此时可以插入一条新的记录;
.dsSetKey 只适用于TTable和TClientDataSet,此时可以设置范围和键值,并且可以调用GotoKey函数;
.dsCalcFields 正在处理OnCalcFields事件,此时不能修改非计算字段的值;
.dsCurValue 内部使用;
.dsNewValue 内部使用;
.dsOldValue 内部使用;
.dsFilter 正在进行过滤操作。
当一个数据集刚刚打开的时候,它的State属性被设为dsBrowse,以后,State属性的值会随着应用程序的操作自动变化
回到dsBrowse状态,可以调用Cancel、Post或Delete函数,其中,如果Post和Delete没有调用成功的话,就仍然保持dsEdit状态。
进入dsInsert状态,可以调用Insert或Append函数。调用Insert或Append并不能保证一定能进入dsInsert状态,这还取决于CanModify属性的值是否返回True。
进入dsSetKey状态,可以调用SetKey。
进入dsInactive状态,可以调用Close ,或者把Active属性设为False
当正在处理OnCalcFields事件时,就自动进入dsCalcFields状态。当退出处理OnCalcFields事件的句柄时,数据集自动恢复成原先的状态。
当数据集的状态发生改变时,会触发TDataSource构件的OnStateChange事件,如果这个TDataSource构件的DataSet属性指定了这个数据集的话。
当OnFilterRecord事件被触发时,就会使数据集进入dsFilter状态,当OnFilterRecord事件处理完毕,数据集就回到dsBrowse状态。
当用户修改数据集的记录时,在允许缓存更新的情况下,数据集有可能会进入dsNewValue、dsOldValue或dsCurValue状态。在这三种状态下,可以通过字段(TField)的NewValue、OldValue或CurValue属性来访问当时的值。
可以调用Locate、Lookup在数据集中搜索特定的记录。对于TTable构件来说,
还可以调用GotoKey、GotoNearest、FindKey或FindNearest在表格中搜索特定的记录,调用了后,数据集又回到dsBrowse状态。
在数据控件中,当用户修改了数据后把输入焦点移走,就相当于调用Post函数,将使数据集回到dsBrowse状态。