【转】【delphi】ClientDataSet详细解读
原文:http://www.cnblogs.com/lcw/p/3496764.html
TClientDataSet的基本属性和方法
TClientDataSet控件继承自TDataSet,其数据存储文件格式扩展名为 .cds/.xml,是基于文件型数据存储和操作的控件。
该控件封装了对数据进行操作处理的接口和功能,而本身并不依赖其它数据库驱动程序,基本上能满足单机"瘦"数据库应用程序的需要。
FieldDefs: 字段定义列表属性
可通过单击属性编辑器中的属性编辑按钮,或在该控件上单击右键选择弹出菜单中的"Fields Editor"菜单进行字段编辑。设置完此属性后,实际上就相当于定义了表的结构;
如果想装入已有的数据表的结构和数据,可通过单击右键选择弹出菜单中的"Assign Local Data"菜单,从弹出对话框中选取当前窗体中已与数据库连接好的数据集控件名称即可(当前窗体中必须已放置好要套用的数据集控件并打开激活)
使用注意:对于自定义的字段名表,该属性编辑完后,该控件仍然无法打开。必须右键单击该控件,选择弹出菜单中的"Create DataSet"菜单,让该控件以上述编辑的字段列表为依据,创建数据集后,才能够被激活打开和使用。否则,会出现类似"ClientDataSet1: Missing data provider or data packet."的错误(包括在运行期,运行期可调用该控件的CreateDataSet方法,从而动态定义字段和表)
FileName:数据存储文件的名称
因该控件是基于文件型的数据操作控件,因此,必须指定所操作的数据文件名称(默认扩展名称.cds),从而打开和激活该控件,进而进行数据编辑。
例如:利用此属性打开指定的.cds文件

var
Path: string;
begin
Path := ExtractFilePath(Application.ExeName); //取得可执行文件路径
CDataSet1.FileName := Path + 'test.cds';
CDataSet1.Open;
end;

CreateDataSet:以FieldDefs中的字段名表为结构建立数据集,常用来进行动态定义表。
例如:动态创建一具有姓名和年龄两个字段的数据集
Open:打开和激活数据集控件,从而进行数据编辑
- 如果指定了FileName属性,则直接用Open方法即可打开和激活该控件
- 如果未指定FileName属性,可用动态创建和打开数据集,进而操作数据
LoadFromFile/SaveToFile:从文件中装入表结构和数据以及存储数据到文件
例如::将数据集的数据存储到指定文件中
CDataSet.SaveToFile('c:\windows\desktop\test.cds');
Filter, Filtered: 过滤筛选属性
说明:用于筛选指定条件的记录,用法同一般数据集控件,略。
例如:在已经激活打开的数据集中筛选性别为男性的记录
其它方法
First(到首),Prior(向前),Next(向后),Last(到尾),Edit(编辑),CanCel(取消编辑),Post(保存),Insert(插入记录),Append(添加记录),Delete(删除),Refresh(数据刷新)等
说明:
- 当指定了FileName属性时,其Post方法可将数据存入指定的文件中,类似其SaveToFile方法;
- 如果未指定存储文件名,则Post方法只将数据存储在RAM中。
- 其它方法,同一般数据集控件使用方法
使用TClientDataSet控件的应用程序发布的注意事项
使用TClientDataSet控件的程序发布时不需要任何数据库驱动程序,大大节省了安装文件的大小。
但是,在发布程序时别忘了将Windows系统目录下midas.dll与应用程序一起发布,否则,程序可能无法正常运行。
手动建立数据集
示例代码:
代码可另写为(下面这种方法简单, 但上一种方法可设置更多选项):
数据读取
方法介绍
- 读取字段的结构信息可以使用 TFieldDef 对象(一般来源于 FieldDefs 或 FieldDefList);
- 现在要读取其中的数据, 应该使用 TField 对象(一般来源于 Fields 或 FieldList).
- Fields[0]、Fields[1] ... Fields[n] 获取的是当前行的第几个字段, 可用 Next、RecNo 等指定当前位置(行).
数据读取示例:
例子使用了 Common Files\CodeGear Shared\Data\holdings.xml, 若更换文件需调整代码
这是 holdings.xml 的字段信息
先窗体上放置 ClientDataSet1、DataSource1、DBGrid1、Memo1 和七个 Button
数据查找
方法介绍
- Locate: 根据字段列表和对应的字段值查找并定位, 找到返回 True.
- Lookup: 根据字段列表和对应的字段值查找, 返回需要的字段值.
- SetKey、GotoKey 或 SetKey、GotoNearest: 根据索引字段的值查找, 先切换状态再根据条件定位.
- FindKey 或 FindNearest: 根据索引字段的值查找.
其中的 GotoNearest、FindNearest 在找不到的情况下会定位到近似值
测试代码:
索引与排序
索引的目的有三: 快速定位、排序、建立主从表.
相关属性与方法:
添加索引的方法有二:
- 用 IndexFieldNames 通过字段名(多个字段用 ; 隔开)指定临时索引;
- 通过 IndexDefs.AddIndexDef 或 AddIndex 建立索引, 然后用 IndexName 指定为当前索引.
两种方法都可以在设计时完成; 后者会有更多功能, 譬如倒排序;
两种方法是互斥的, 指定一个会自动取消另一个.
TClientDataSet 会自动生成两个默认索引:
- DEFAULT_ORDER、CHANGEINDEX; 它们都不允许用户删改.
- CHANGEINDEX 是用于 Delta(日志)的.
- DEFAULT_ORDER 可用于恢复默认排序;
- 它可能已经和某些字段关联, 如(xml 源码):<PARAMS DEFAULT_ORDER="1" PRIMARY_KEY="1" ... /> 或<PARAMS DEFAULT_ORDER="1 2" PRIMARY_KEY="1 2" ... />
关于临时索引最常用的代码是在 DBGrid 的 OnTitleClick 事件中更换索引, 如:

{ 根据当前字段排序 }
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
if not Column.Field.IsBlob then { 不能给大二进制字段建立索引或排序 }
ClientDataSet1.IndexFieldNames := Column.FieldName;
end;
{ 恢复默认排序 }
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientDataSet1.IndexName := 'DEFAULT_ORDER';
end;

使用 IndexFieldNames 可指定多个字段, 如: ClientDataSet1.IndexFieldNames := '字段x; 字段y; 字段z';
此时顺序很重要, 这里会先按 "字段x" 排序; 在 "字段x" 的值相同时会按 "字段y" 排序; 在 "字段y" 的相同时...
IndexFieldNames 没有更多了, 更复杂的排序就需要建立排序对象(TIndexDef)了.
实现倒排序的例子:
关于 AddIndex
AddIndex 的一些用法(都是先 F1 后 F2)
AddIndex 能做到的, 用 IndexDefs.AddIndexDef 也可以, 并且也都能在设计时完成
分组统计
运行时实现的分组统计:
参考文章
http://www.cnblogs.com/Dragon7/archive/2011/08/31/2161244.html
http://www.cnblogs.com/del/
【转】【delphi】ClientDataSet详细解读的更多相关文章
- 【delphi】ClientDataSet详细解读
TClientDataSet的基本属性和方法 TClientDataSet控件继承自TDataSet,其数据存储文件格式扩展名为 .cds/.xml,是基于文件型数据存储和操作的控件. 该控件封装了对 ...
- MemCache超详细解读
MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...
- MemCache超详细解读 图
http://www.cnblogs.com/xrq730/p/4948707.html MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于 ...
- Delphi TStream 详细介绍
Delphi TStream 详细介绍Stream对象,又称流式对象,是TStream.THandleStream.TFileStream.TMemoryStream.TResourceStream和 ...
- rpm软件包管理的详细解读
CentOS系统上使用rpm命令管理程序包:安装.卸载.升级.查询.校验.数据库维护 1.基本安装 rpm -ivh PackageFile 2.rpm选项 rpm -ivh --test Packa ...
- MemCache详细解读
MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...
- Android BLE蓝牙详细解读
代码地址如下:http://www.demodashi.com/demo/15062.html 随着物联网时代的到来,越来越多的智能硬件设备开始流行起来,比如智能手环.心率检测仪.以及各式各样的智能家 ...
- 为你详细解读HTTP请求头的具体含意
当我们打开一个网页时,浏览器要向网站服务器发送一个HTTP请求头,然后网站服务器根据HTTP请求头的内容生成当次请求的内容发送给浏览器.你明白HTTP请求头的具体含意吗?下面一条条的为你详细解读,先看 ...
- 详细解读Volley(三)—— ImageLoader & NetworkImageView
ImageLoader是一个加载网络图片的封装类,其内部还是由ImageRequest来实现的.但因为源码中没有提供磁盘缓存的设置,所以咱们还需要去源码中进行修改,让我们可以更加自如的设定是否进行磁盘 ...
随机推荐
- 学习笔记:使用opencv做双目测距(相机标定+立体匹配+测距).
最近在做双目测距,觉得有必要记录点东西,所以我的第一篇博客就这么诞生啦~ 双目测距属于立体视觉这一块,我觉得应该有很多人踩过这个坑了,但网上的资料依旧是云里雾里的,要么是理论讲一大堆,最后发现还不知道 ...
- Android Monkey 脚本编写与检查内存泄露
一.Monkey脚本编写 1.Monkey脚本格式 脚本优势: 简单快捷,不需要接触任何工具,只需要一个记事本文件 脚本缺点: 实现坐标.按键等基本操作的相应步骤,顺序脚本无逻辑性 脚本源码: \de ...
- python基础7--集合
集合set Python的set集合是一个无序不重复元素集.基本功能包括关系测试和消除重复元素.集合对象还支持union(并集).intersection(交集).difference(差集) 和 s ...
- SpringCloud学习(6)——Hystrix熔断器
分布式系统面临的问题 复杂的分布式体系结构中的应用程序有数十个依赖关系, 每个依赖关系在某些时刻不可避免的失败. 服务雪崩效应 多个微服务调用的时候, 假设微服务A调用微服务B和微服务C, 微服务B和 ...
- maven 依赖、聚合和继承 (转)
Maven 插件和仓库 Maven 本质上是一个插件框架,它的核心并不执行任何具体的构建任务,仅仅定义了抽象的生命周期,所有这些任务都交给插件来完成的.每个插件都能完成至少一个任务,每个任务即是一个功 ...
- NOIP模拟6
期望得分:100+100+100=300 实际得分:0+100+90=190 T1 superman 二分给每条边加多少,判断是否存在负环 #include<queue> #include ...
- 树上的构造 树分治+树重心的性质 Codeforces Round #190 (Div. 2) E
http://codeforces.com/contest/322/problem/E E. Ciel the Commander time limit per test 1 second memor ...
- Laravel是怎么实现autoload的?
用了一阵Laravel后发现很少有include和require,觉得有点奇怪,思考Laravel是怎么完成文件导入的. 其实Laravel依旧还是用include或者require的,只是都写在一个 ...
- Log-structured File Systems
换到博客园排版有问题,原版在这里:http://xubenbenhit.github.io/LogStructureFileSystem.html Log-structured File System ...
- 关于static关键字
static用于修饰成员(成员变量,成员函数),不能修饰局部变量被修饰的变量和函数是静态的,可被多个对象共享,节省内存可以直接被类名调用++++++++++++++++++++++++++++++++ ...