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中。