ClientDataSet的数据查找。
我所介绍的心得和技巧都是用ClientDataSet来做范例,也可以应用于其他的一些DataSet。废话就不多说了。我们还是先看代码,让后再总结。
1.Scanning 扫描数据查找
这是最简单最直接也是最慢的一种方法,遍历所有数据:
procedure TForm1.ScanBtnClick(Sender: TObject);
var
Found: Boolean;
begin
Found := False;
ClientDataSet1.DisableControls;
Start;
try
ClientDataSet1.First;
while not ClientDataSet1.Eof do
begin
if ClientDataSet1.Fields[FieldListComboBox.ItemIndex].value =
SearchText then
begin
Found := True;
Break;
end;
ClientDataSet1.Next;
end;
Done;
finally
ClientDataSet1.EnableControls;
end;
if Found then ShowMessage(SearchText +
' found at record ' + IntToStr(ClientDataSet1.RecNo))
else
ShowMessage(ScanForEdit.Text + ' not found');
end;
2.Finding 寻找数据
最老,但是最快的查找方式。
使用FindKey/FindNearest来查找一条或多条符合条件的数据,当然待查找的Field必须是一个IndexField。可以看出,这种基于Index的查找速度是非常快的。
procedure TForm1.FindKeyBtnClick(Sender:
TObject);
begin
Start;
if ClientDataSet1.FindKey([SearchText]) then
begin
Done;
StatusBar1.Panels[3].Text := SearchText +
' found at record ' +
IntToStr(ClientDataSet1.RecNo);
end
else
begin
Done;
StatusBar1.Panels[3].Text :=
SearchText + ' not found';
end;
end;
procedure TForm1.FindNearestBtnClick(Sender: TObject);
begin
Start;
ClientDataSet1.FindNearest([SearchText]);
Done;
StatusBar1.Panels[3].Text := 'The nearest match to ' +
SearchText + ' found at record ' +
IntToStr(ClientDataSet1.RecNo);
end
3.Going 定位
GotoKey/GotoNearest 与FindKey/FindNearest基本上没有什么区别。它也是基于Index的查找。唯一的区别就是在于你是怎么定义你的查找了。代码上也有区别:
ClientDataSet1.SetKey;
ClientDataSet1.FieldByName(IndexFieldName).value := SearchText;
ClientDataSet1.GotoKey;
就相当于
ClientDataSet1.FindKey([SearchText]);
要用好这两种基于Index的查找,还需要了解ClientDataSet和Index机制。这里就不详细说明Index机制。一个基本的原则,要有Index,才能查找。
4.Locating 查找数据
2,3 两种查找方式都是基于Index的,但是在实际应用中,可能会查找IndexField以外的Field。那我们就可以使用Locate。但是查找速度是没有2,3两种快的。比如:如果你查找一条纪录9000/10000,Locate需要500ms,Scanning需要>2s,FindKey只要10ms(但是当你打开ClientData的时候,建立Index需要1s)。
procedure TForm1.LocateBtnClick(Sender:
TObject);
begin
Start;
if ClientDataSet1.Locate('Field1,Field2..',VarArrayOf['value1,value2..'], []) then
begin
Done;
StatusBar1.Panels[3].Text :=
'Match located at record ' +
IntToStr(ClientDataSet1.RecNo);
end
else
begin
Done;
StatusBar1.Panels[3].Text := 'No match located';
end;
end;
小结:
ClientDataSet提供了好多种查找数据的方法。但是各自有其优缺点。
上面的例子中有Start;和Done,如果你有兴趣,可以加入计时点进行速度测试。
Scanning最简单,但是最慢,因为比较慢,还得使用ClientDataSet.DisableControls和ClientDataSet.EnableControls方法(我在前面一片文章讲过)。
Findkey/FindNearest(GotoKey/GotoNearest)代码多,但是非常快。必须使用Index,不同的是Find需要的Index是必须建立好的,而Goto可以在第一次使用时建立Index。
Locate使用最方便,不需要Index,但是速度没有Find快。
影响ClientDataSet处理速度的一个因素
TClientDataSet是Delphi开发数据库时一个非常好的控件。有很强大的功能。
我常常用ClientDataSet做MemoryDataSet来使用。还可以将ClientDataSet的数据保存为XML,这样就可以做简单的本地数据库使用。还有很多功能就不多说了。在使用ClientDataSet的过程中关于怎样提高处理速度这个问题,我就我个人的一点点体会和大家分享一下。
通常情况下我们一般都是用
...ClientDataSet-->DataSource-->DBComponent
这样的结构,处理数据的时候就直接操作ClientDataSet。但是大多DBComponet都会立即响应ClientDataSet的变化。如果你是向ClientDataSet中插入很多数据时候,DBComponent就要响应几次,而且响应过程根据不同的控件,速度,过程数量都不一样。这样就影响了程序的执行效率。所以在对ClientDataSet处理中,我是用ClientDataSet.DisableControls和 ClientDataSet.EnableControls方法:打开和关闭DBComponent与ClientDataSet的数据显示关系。
例如:
ClientDataSet..DisableControls;
...
for I := 0 to 10000 do
begin
ClientDataSet.Append;
...
ClientDataSet.Post;
end;
...
ClientDataSet.EnableControls
...
这样做以后你会发现处理速度比以前没有使用方法的时候有成倍的提高。
http://wenwen.soso.com/z/q186204929.htm
分享到:
相关推荐
网上看了一些转的方法都有漏洞下面直接上代码
在Delphi中,我们可以通过定义数据字段、关联字段类型和数据源,使ClientDataSet与XML数据匹配。一旦XML数据被加载到ClientDataSet,就可以进行查询、编辑和过滤等操作。 5. **错误处理和调试**:在实际应用中,...
摘要:Delphi源码,控件组件,ClientDataSet Delphi环境下的ClientDataSet使用例子。ClientDataSet是Delphi三层开发常用控件。通过此例子帮助那些初学者学会ClientDataSet的使用,简单易懂。演示打开本地文件、保存到...
- 在Delphi中,默认情况下,字符串比较是大小写敏感的。如果在过滤条件中没有正确处理大小写问题,则可能导致过滤结果不准确。 - `ClientDataSet`提供了`FILTEROPTIONS`属性来控制过滤时的行为。其中`...
将ClientDataset的Delta数据打包成JSon字符串 可以将这个JSon字符串传递到服务端, 进行解码,生成更新的SQL语句. 主键更新. 建议主键使用GUID,这样更新数度快, SELECT可以多个表,但是要更新的字段不要AS成其他名字. ...
在IT领域,ClientDataSet(CDS)是一种在 Delphi 和 C++Builder 等RAD Studio环境中广泛使用的组件,用于处理离线数据。它允许开发者在应用程序中存储、编辑和过滤数据,而无需直接连接到数据库服务器。在这个...
Delphi中的参数需要转换为JNI的数据类型,如`jstring`表示Java的`String`。调用Java方法时,传递这些参数。Java方法执行完成后,结果会返回,同样需要从JNI类型转换回Delphi类型。 6. **异常处理** Java的异常在...
Delphi 10.3 ,程序运行到DataModule2.ClientDataSet1.ApplyUpdates(0);语句时,提示“Invalid parameter”错误
在 Delphi 开发环境中,内存中的数据修改是一个常见的任务,特别是在处理数据库或其他数据源时。本示例将探讨如何在 Delphi 中直接操作内存中的数据,以实现对数据源的修改。Delphi 提供了丰富的组件库和语言特性,...
为了在Delphi中处理JSON数据,开发者通常会依赖第三方库,如本压缩包中提供的"JsonDataObjects.pas"和"superobject.pas"。 "JsonDataObjects.pas"可能是一个基于Delphi 7的JSON库,它提供了一系列类和方法来解析、...
### Delphi中ClientDataSet的应用详解 #### 一、概述 `ClientDataSet`是Delphi中一个重要的数据库组件,主要用于客户端应用程序。它从`TDataSet`类派生而来,具有多种特性,使其非常适合于多层架构的开发场景。与`...
ClientDataSet(简称CDS)是Delphi数据库编程中的一种重要组件,它是从TDataSet派生出来的,常用于构建多层架构的客户端应用。与TTable和TQuery不同,CDS并不直接依赖BDE(Borland Database Engine),而是依赖于...
客户程序必须提供获取数据的机制,在Delphi 4中,TClientDataSet有三种途径获取数据:从文件中存取数据、从本地的另一个数据集中获取数据、通过IProvider接口从远程数据库服务器获取数据。 在浏览和编辑数据时,...
1. **DBGrid组件**:DBGrid是Delphi中用于显示和编辑来自数据源(如TClientDataSet)的表格数据的可视化组件。它能够自动根据数据字段的数量和类型创建列,并且支持用户交互,如排序、过滤和编辑。 2. **...
在Delphi中,实现主从表控制通常涉及到以下步骤: 1. **数据模型设计**:在数据库层面,需要定义好主从表的关系,通常是通过外键约束实现。例如,订单详情表有一个订单ID字段,它是订单表的外键。 2. **服务端设置...
本文将深入探讨如何在Delphi中结合DBExpress和元数据进行数据库操作,并通过实例来展示具体实现步骤。 首先,DBExpress的核心组件是SQLDriver,它负责建立到特定数据库系统的连接。每个SQLDriver都有对应的...
Delphi通过WebService访问数据库. 1.查询数据 procedure TForm1.Button1Click(Sender: TObject); var ls_Table: string; ls_Service: Service1Soap; begin ls_Service := Buf_GetBuleService; ls_Table := '...
标题 "DataSnap通过json上传clientdataset数据集到服务端并解释" 涉及到的是在IT领域中,特别是Delphi开发环境下,使用DataSnap框架将客户端的数据集以JSON(JavaScript Object Notation)格式发送到服务器的过程。...
在Delphi中,XML作为一种灵活的数据交换格式,常用于保存和传输结构化数据。下面我们将深入探讨这个主题。 首先,让我们了解ClientDataSet。CDS是一个内存中的数据集,它可以不直接连接到数据库,而是从多种数据源...
Delphi演示如何一次删除网格数据表dbgrid中的多条记录,小技巧不过挺实用,希望对大家的Delphi编程有所帮助。以下是实现一次删除多条记录的相关代码供参考: if DBGrid1.SelectedRows.Count >1 then s:= '真的要...