ClientDataSet在可以使用Locate,Lookup和SetRange方法在本地(如果本地数据只是一张表的一部分数据会从服务器下载整张表)数据集中快速找到想要的数据,而不必用SQL访问数据库,这样不仅减少了查询时间,也减轻了服务器的负担,提高了网络利用率。

Locate函数:

function Locate(const KeyFields: string;const KeyValues: Variant; Options: TLocateOptions): Boolean;

参数KeyFields指定查找的字段,如有多个字段用分号(;)分隔。

参数KeyValues指定要查找字段的值,如有多个值要用VarArrayOf()构成数组进行传递。

参数Options选项,指定是否区分大小写,是否部分匹配。

TLocateOption = (loCaseInsensitive, loPartialKey);

如果找到记录返回TRUE,并把记录移到该条数据上。否则返回FALSE。

Lookup函数:

function Lookup(const KeyFields: string; const KeyValues: Variant;const ResultFields: string): Variant;

参数KeyFields指定查找的字段,如有多个字段用分号(;)分隔。

参数KeyValues指定要查找字段的值,如有多个值要用VarArrayOf()进行传递。

参数ResultFields指定要返回的字段,如有多个如有多个字段用分号(;)分隔。

当ResultFields返回多个时,是一个数组,用if VarIsArray()判断下,为true时用vararraylowbound和vararrayHighbound遍历取出结果。

Lookup匹配到就返回结果,但不会移动记录指针。

Locate和Lookup都只会返回匹配到的第一个记录。如果要返回多个记录就要用到过滤功能或SetRange。

ClientDataSet中的过滤功能可以返回符合条件的记录的子集。

ClientDataSet.Filtered设为ture即可开启过滤,关闭为false。

ClientDataSet.Filter:='过滤条件',这种方式使用字符串来设置过滤条件。不适合用于复杂的过滤。

ClientDataSet1.OnFilterRecord过使用DELPHI语法过滤复杂的条件。

OnFilterRecord事件原型:

procedure FilterRecord(DataSet:TDataSet;var Accept:Boolean);

参数DataSet触发事件的数组集。

参数Accept,符合过滤条件的设为true,否则设为false。

ClientDataSet.FilterOptions选项设置是否区分大小写。

TFilterOption = (foCaseInsensitive, foNoPartialCompare);

SetRange方法:

此方法只能用于索引字段。原型:

procedure SetRange(const StartValues, EndValues: array of const);

参数StartValues指定开始值。

参数EndValues指定结束值。

可调用CancelRange恢复到SetRange之前的结果。

************************************************************************************************************************

注意:以上的方法最好用于过滤本地数据集,如果服务端中有还存有大量数据ClientDataSet会把数量全部取到本地再过滤,不仅造成网络负担,降低服务器性能,还有可能引起客户端内存不足导致程序崩溃。所有通常会用CloneCursor方法或Data属性把数据给另一个ClientDataSet2,再在ClientDataSet2中调用Locate,Lookup,filter,避免从服务器下载大量数据。如果在本地数据集中没有符合条件的,就转为SQL语句让服务器帮忙查找,这样就只会返回符合条件的结果到ClientDataSet中。

posted on 2017-03-10 15:15  sun繁星点点  阅读(931)  评论(0编辑  收藏  举报