zoukankan      html  css  js  c++  java
  • ClientDataSet的查找和过滤功能

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

  • 相关阅读:
    智能实验室-杀马(Defendio) 4.12.0.800
    智能实验室-结构化存储浏览器(SSExplorer) 1.7.0.170
    智能实验室-全能优化(Guardio) 4.94.0.830
    智能实验室-全能优化(Guardio) 4.9.0.790
    IT餐馆—第二十二回 控件
    当DiscuzNT遇上了Loadrunner(中)
    在Discuz!NT中进行缓存分层(本地缓存+memcached)
    介绍三个Silverlight 在线编辑器控件
    玩玩负载均衡在window与linux下配置nginx
    IT餐馆—第十八回 祭奠
  • 原文地址:https://www.cnblogs.com/sun998/p/6528606.html
Copyright © 2011-2022 走看看