Delphi中ClientDataSet的用法小结

Delphi中ClientDataSet的用法小结

TClientDataSet控件继承自TDataSet,其数据存储文件格式扩展名为 .cds,是基于文件型数据存储和操作的控件。该控件封装了对数据进行操作处理的接口和功能,而本身并不依赖上述几种数据库驱动程序,基本上能满足单机"瘦"数据库应用程序的需要。

一、TClientDataSet的基本属性和方法介绍

1、FieldDefs: 字段定义列表属性

开发者可通过单击属性编辑器中该属性编辑按钮,或在该控件上单击右键选择弹出菜单中的"Fields Editor"菜单进行字段编辑。设置完此属性后,实际上就相当于定义了表的结构;如果想装入已有的数据表的结构和数据,可通过单击右键选择弹出菜单中的"Assign Local Data"菜单,从弹出对话框中选取当前窗体中已与数据库连接好的数据集控件名称即可(当前窗体中必须已放置好要套用的数据集控件并打开激活)。

使用注意:

对于自定义的字段名表,该属性编辑完后,该控件仍然无法打开。必须右键单击该控件,选择弹出菜单中的"Create DataSet"菜单,让该控件以上述编辑的字段列表为依据,创建数据集后,才能够被激活打开和使用。否则,会出现类似"ClientDataSet1: Missing data provider or data packet."的错误(包括在运行期,运行期可调用该控件的CreateDataSet方法,从而动态定义字段和表)。

2、FileName属性

说明:数据存储文件的名称。因该控件是基于文件型的数据操作控件,因此,必须指定所操作的数据文件名称(默认扩展名称.cds),从而打开和激活该控件,进而进行数据编辑。

例1:利用此属性打开指定的.cds文件

Delphi代码

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

3、CreateDataSet方法

说明:该方法以FieldDefs中的字段名表为结构建立数据集,常用来进行动态定义表。

例2:动态创建一具有姓名和年龄两个字段的数据集。

Delphi代码

//创建字段名表
CDataSet.FieldDefs.Clear;
withCDataSet.FieldDefs.AddFieldDefdo
beginName:='Name';Size:=10;DataType:=ftString;
end;
withCDataSet.FieldDefs.AddFieldDefdo
beginName:='Age';DataType:=ftInteger;
end;//动态创建数据集CDataSet.CreateDataSet;
//激活和打开该数据集CDataSet.Open;

4、Open方法

说明: 打开和激活数据集控件,从而进行数据编辑。a. 如果指定了FileName属性,则直接用Open方法即可打开和激活该控件,见例1。b. 如果未指定FileName属性,可使用例2方法动态创建和打开数据集,进而操作数据。

5、LoadFromFile和SaveToFile

说明:从文件中装入表结构和数据以及存储数据到文件。该方法类似于Word中的打开新文件和另存为的功能。

例3:将数据集的数据存储到指定文件中

Delphi代码

CDataSet.SaveToFile('C:WindowsHUTest.cds');

6、First(到首),Prior(向前),Next(向后),Last(到尾),Edit(编辑),CanCel(取消编辑),Post(保存),Insert(插入记录),Append(添加记录),Delete(删除),Refresh(数据刷新)等数据集常用方法。

说明:当指定了FileName属性时,其Post方法可将数据存入指定的文件中,类似其SaveToFile方法;如果未指定存储文件名,则Post方法只将数据存储在RAM中。其它方法,同一般数据集控件使用方法,略。

7、Filter, Filtered: 过滤筛选属性

说明:用于筛选指定条件的记录,用法同一般数据集控件,略。

例4:在已经激活打开的数据集中筛选性别为男性的记录

Delphi代码

CDataSet.Close;
CDataSet.Filter:='性别='''+'男'+'''';
CDataSet.Filtered:=True;
CDataSet.Open;

二、使用TClientDataSet控件的应用程序发布的注意事项:

如前所述,使用TClientDataSet控件的程序发布时不需要任何数据库驱动程序,大大节省了安装文件的大小。但是,在发布程序时别忘了将Windows系统目录下midas.dll(257KB)与应用程序一起发布(运行必须),否则,程序仍然无法正常运行。

通过使用Delphi中TClientDataSet控件,既实现了应用程序可彻底脱离数据库驱动程序,也实现了常规数据集控件简单易用的特性,为编写"瘦"数据库应用程序提供了一种技术方法和手段。

三、TClientDataSet在三层结构中,TClientDataSet的地位是不可估量的,本文从以下几个方面阐述她的使用。

1、动态索引

Delphi代码

procedureTForm1.DBGrid1TitleClick(Column:TColumn);
begin
if(notcolumn.FieldisTblobfield)then//Tblobfield不能索引,二进制
ClientDataSet1.IndexFieldNames:=column.Field.FieldName;
end;

2、多层结构中主从表的实现

设主表ClientDataSet1.packetrecord为-1,所有记录;

设从表ClientDataSet1.packetrecord为0,当前记录。

3、Taggregates使用

(1)在字段编辑中add new field类型为aggregates
后设置expression(表达试)
设置active:=true即可
使用dbedit的field为前者即可
(2)使用Aggergates属性add设计表达试
调用

Delphi代码

ShowMessage(FloatTostr(ClientDataSet1.Aggregates.Count));
ShowMessage(ClientDataSet1.Aggregates.Items[0].Value);

4、在单层数据库中不要BDE

使用ClientDataSet代替table,使用ClientDataSet的loadfilename装入cds代替table的tablename的db或者dbf

引用:

原来的程序改造方法:
加一个ClientDataSet,使用右键assign locate data
后savetofile,再loadfromfile,后删除table
将原连table的datasource设为ClientDataSet
唯一注意的是:要将midas.dll拷到system或者当前目录

5、三层结构的公文包的实现方法

同时设定:filename(*.cds)2.remote server

6、可以对data赋值(从另一个数据集取值)

Delphi代码

ClientDataSet2.Data:=ClientDataSet1.Data;
ClientDataSet2.Open;

或者

Delphi代码

ClientDataSet2.CloneCursor(ClientDataSet1,true);
ClientDataSet2.Open;

7、附加数据取得

客户程序向应用服务器请求数据。如果TClientDataSet 的FetchOnDemand 属性设为True,客户程序会根据需要自动检索附加的数据包如BLOB字段的值或嵌套表的内容。否则,客户程序需要显式地调用GetNextPacket 才能获得这些附加的数据包。ClientDataSet的packetrecords设置一次取得的记录个数。

8、ClientDataSet与服务器端query连接方法

(1)sql内容为空

Delphi代码

ClientDataSet1.Close;
ClientDataSet1.CommandText:=edit1.Text;//即sql内容
ClientDataSet1.Open;

对于没有应用服务器设置filter 如:country like 'A%',filtered=true可实现sql功能。

(2)有参数

如服务端query的sql为

select * from animals
where name like :dd

则:客户端ClientDataSet

Delphi代码

var
pm:Tparam;
begin
ClientDataSet1.Close;
ClientDataSet1.ProviderName:='DataSetProvider1';
pm:=Tparam.Create(nil);
pm.Name:='dd';
pm.DataType:=ftString;
ClientDataSet1.Params.Clear;
ClientDataSet1.Params.AddParam(pm);
ClientDataSet1.Params.ParamByName('dd').AsString:=edit1.Text;
ClientDataSet1.Open;
pm.Free;
end;

9、数据的更新管理

(1)savepoint 保存目前为止数据状态,可以恢复到这个状态

Delphi代码

var
pp:integer;
begin
pp:=ClientDataSet1.SavePoint;
ClientDataSet1.Edit;
ClientDataSet1.FieldByName('姓名').asstring:='古话';
ClientDataSet1.Post;
table1.Refresh;
end;

恢复点:ClientDataSet1.SavePoint:=pp;

(2)Cancel,RevertRecord

取消对当前记录的修改,只适合没有post的,如果post,调用RevertRecord 。

(3)CancelUpdate

取消对数据库所有的修改

(4)UndoLastChange(boolean),changecount

取消上一次的修改,可以实现连续撤消。参数为true:光标到恢复处;false:光标在当前位置不动。changecount返回修改记录的次数,一个记录修改多次,返回只一次,但UndoLastChange只撤消一次。

10、可写的recno

对于Ttable和Tquery的recno是只读的,而TClientDataSet的recno可读可写ClientDataSet1.recno:=5;是设第五个记录为当前记录。

11、数据保存

对于table使用post可更新数据,而ClientDataSet1的post只更新内存数据,要更新服务器数据要使ApplyUpdates(MaxErrors: Integer),他有一个参数,是允许发出错误的次数,-1表示无数次,使用simpleobjectbroker时常设为0,实现自动容错和负载平衡。

1.基本情况介绍; clientdataset内存表,他的data属性存放的是数据, delta 增量记录的是日志, 就相当于数据库的 savepoint保存点;每当clientdataset的数据有变化时(onbeforeedit, onafteredit),savepoint都会变化。如果我们想取消一段时间的操作,我们可以先记录下这个savepoint,然后修改,如果想取消,直接让这个savepoint = 以前的那个点即可。

try thisvar
BaseLine:Integer;
begin
with ClientDataSet1 do
begin
BaseLine:=SavePoint;
Insert;
FieldByName('Name').AsString:= Edit1.Text;
FieldByName('Weight').AsInteger:= StrToInt(Edit2.Text);
if 提交 then
MergeChangeLog
else //取消
SavePoint:=BaseLine;
end;
end;
  1. clientdaset可以不连接数据库直接使用,如果设置了clientdataset的filename属性,那么在数据集打开或者关闭的时候,都会将数据集里的数据保存到对应的文件中,这个过程是会合并日志的。也就是说你编辑到什么状态,然后下次打开还是什么状态。

3.mergechangelog; 就是将 delta里面的操作日志跟 data合并,

4.emptydataset,清空数据集。

5.三层服务的构造方法,在客户端放上clientdataset, 然后放上socketconnect; webconnection是不是也可以?然后将clientdataset的remoteserver 指向 socketserver; clientdataset的dataprovider设置为服务器上的datasetprovider 服务器上放上dataprovider即可。provide里面有个onrequest命令,可以接受客户端发过来的命令。

6.创建内存表:createdataset,创建数据集。

//明细表内存对象创建
with cdsDtl do
begin
with FieldDefs do
begin
Clear;
//数据库字段
Add('Num', ftString, 14, False);
Add('Cls', ftString, 10, False);
Add('Line', ftInteger, 0, False);
Add('GDCode', ftString, 20, False);
Add('sl', ftInteger, 0, False);
Add('GID', ftInteger, 0, False);
//ToDo 增加业务明细字段//辅助字段
Add('GDName', ftString, 120, False);
Add('Note', ftString, 255, False);
Add('LSTINPRC', ftFloat, 0, False);
end;
IndexDefs.Add('','Line',[ixPrimary]);
CreateDataSet;
Append;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
self.ds1.FieldDefs.Add('Name',ftString,50);
self.ds1.FieldDefs.Add('Age',ftString,50);
self.ds1.CreateDataSet;
self.ds2.FieldDefs.Add('Name',ftString,50);
self.ds2.FieldDefs.Add('Age',ftString,50);
self.ds2.CreateDataSet;self.ds1.AppendRecord(['100','100']);
self.ds1.AppendRecord(['100','100']);
self.ds1.AppendRecord(['100','100']);
self.ds1.AppendRecord(['100','100']);
self.ds1.AppendRecord(['100','100']);
self.ds1.AppendRecord(['100','100']);
self.ds2.Data:=self.ds1.Delta;
end;procedure TForm1.btn1Click(Sender: TObject);
begin
self.ds1.AppendRecord(['1001','100']);//添加新纪录
self.ds2.Data:=self.ds1.Delta;
end;

李维的书,有空还是看看吧。

提交数据的时候,记得applyupdates(-1,0.3),分别是提交正常的,不管不正常的了,0出错,允许3个出错。

如果我想要通过sql语句更新客户修改的数据,那么我们可以这样做

再放一个ClientDataSet2,用ClientDataSet2.Data=ClientDataSet1.Delta;
while not ClientDataSet2.Eof do
case ClientDataSet2.UpdateStatus of
usDeleted:
XXX

通过将原 clientdataset里面的日志复制到另一个数据集,然后遍历记录,看看修改过的日志。就可以找到修改过的数据了。

Clientdataset在处理几千行数据还是很快的,要是处理上万行数据,是比较慢的。

ClientDataSet1.IndexFieldNames:=’列1;列2’; 添加索引

if ClientDataSet1.FindKey([这里填什么?,X]) then 查找字段。

if ClientDataSet1.State in [DsEdit, DSInsert] then ClientDataSet1.Post;
if ClientDataSet1.ChangeCount > 0 then
begin
if ClientDataSet1.ApplyUpdates(0) = 0 then ClientDataSet1.MergeChangeLog;
end
else
abort;
end
else
exit;

changecount,可以看出数据集是否有改动。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143130.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Python二级 每周练习题20

练习一: 日期计算器 设计一款日期计算程序,能否实现下面的功能: (1)要求用户分别输入年、月、日(分三次输入); (2)程序自动会根据输入的年月日计算出这一天是这一年的第几天; (3)输出格式为:这…

Tomcat基础与优化

Tomcat介绍 Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,Tomcat具有处理HTML页面的功能,通常作为一个Servlet和JSP容器,单独运行…

上网行为监管软件(上网行为管理软件通常具有哪些功能)

在我们的日常生活中,互联网已经成为了我们获取信息、交流思想、进行工作和娱乐的重要平台。然而,随着互联网的普及和使用,网络安全问题也日益突出,尤其是个人隐私保护和网络行为的规范。在这个背景下,上网行为审计软件…

蜜雪冰城涨价怒赞无数 雪王张红超卷出一条阳道

作者:积溪 简评:最近雪王涨价一元登上了热搜,但评论区却是一片和谐,雪王的魅力究竟是如何养成的?#蜜雪冰城 #雪王 #张红超 #奶茶 别的品牌涨价,只有吐槽声一片;但它涨价,却是网友们…

携手低代码平台公司,创造高效率办公!

当前,什么样的平台产品可以实现高效率办公?随着社会化发展程度的推进发展,很多客户朋友希望找到更理想的平台产品,助力企业管理好内部数据,起到链接互通各部门沟通桥梁的作用。低代码开发平台就是其中一种理想的得力助…

如何看待著名游戏引擎 Unity 宣布将更改收费模式,收取「运行时费用」?这将造成哪些影响?

先下结论:Unity 的高管是不是【不友善内容,请于 24 小时内及时更改】? 简单介绍下这个收费模式:年收入大于 20w 美金且安装量大于 20w 的,每一份额外下载需要给 Unity 交 0.2 刀。 首先:听上去好像不会影响…

使用显著性检测的可见光和红外图像的两尺度图像融合(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

树结构数据在table中回显 treeselect disabled

<el-table-column label"产业认定" align"center" prop"industryIdentification"><template slot-scope"scope"><treeselectv-if"scope.row.industryIdentification"v-model"scope.row.industryIdentif…

你听说过推挽电路吗?避免交越失真

推挽电路就是用两个三级管或者场效应管构成的放大电路&#xff0c;这个电路的特点就是输出电阻小&#xff0c;能够驱动大的负载&#xff0c;从而能够使得单片机管脚直接驱动发光二极管、蜂鸣器。上面的三极管是N型三极管&#xff0c;下面的三极管是P型三极管&#xff0c; 当输入…

机器人中的数值优化|【五】BFGS算法非凸/非光滑处理

机器人中的数值优化|【五】BFGS算法的非凸/非光滑处理 往期内容回顾 机器人中的数值优化|【一】数值优化基础 机器人中的数值优化|【二】最速下降法&#xff0c;可行牛顿法的python实现&#xff0c;以Rosenbrock function为例 机器人中的数值优化|【三】无约束优化&#xff0…

Redis的高可用——主从复制、哨兵模式、Redis群集部署

目录 Redis高可用 Redis主从复制 主从复制的作用 主从复制的流程 主从复制部署 Redis哨兵模式 哨兵的核心功能 哨兵模式的作用 哨兵结构的组成 哨兵模式故障转移机制 故障转移过程 哨兵模式部署 Redis群集 集群的作用 Redis集群的数据分片 Redis集群部署 Redi…

手把手教你用 Milvus 和 Towhee 搭建一个 AI 聊天机器人!

作为向量数据库的佼佼者&#xff0c;Milvus 适用于各种需要借助高效和可扩展向量搜索功能的 AI 应用。 举个例子&#xff0c;如果想要搭建一个负责聊天机器人数据管理流程&#xff0c;Milvus 必然是首选向量数据库。那么如何让这个应用程序开发变得易于管理及更好理解&#xff…

构建自动化测试环境:使用Docker和Selenium!

随着软件开发的日益复杂和迭代速度的加快&#xff0c;自动化测试被越来越广泛地应用于软件开发流程中。它能够提高测试效率、减少测试成本&#xff0c;并保证软件质量的稳定性。在构建自动化测试环境方面&#xff0c;Docker 和 Selenium 是两个非常有用的工具。下面将介绍如何使…

cocos2dx查看版本号的方法

打开文件&#xff1a;项目根目录\frameworks\cocos2d-x\docs\RELEASE_NOTES.md 知道引擎版本号的意义&#xff1a; 1.面试中经常被问到(面试官想知道你会不会查版本号&#xff0c;你会查也不一定会去看&#xff0c;如果你去看了说明你是一个有心人&#xff0c;或者想深入研究下…

linux使用操作[3]

文章目录 版权声明环境变量$符号自行设置环境变量 上传、下载rz、sz命令 压缩、解压tar命令压缩tar解压zip 命令压缩文件unzip 命令解压文件 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马程序员或相关权利人…

如何利用人才测评系统提升企业招聘效率

公司需要的是能产出价值的员工&#xff0c;但是要想找到完全符合条件的员工&#xff0c;其实并不容易&#xff0c;尽管应聘的人数很多&#xff0c;但不是跳槽的&#xff0c;就是转行的&#xff0c;要么就只能从应届生培养开始了。 从招聘流程上&#xff0c;以现在的模式&…

SoftwareTest3 - 要了人命的Bug

软件测试基础篇 一 . 如何合理的创建一个 Bug二 . Bug 等级2.1 崩溃2.2 严重2.3 一般2.4 次要 三 . Bug 的生命周期四 . 跟开发产生争执应该怎么解决 Hello , 大家好 , 又给大家带来新的专栏喽 ~ 这个专栏是专门为零基础小白从 0 到 1 了解软件测试基础理论设计的 , 虽然还不足…

Rabbit消息的可靠性

生产者重连 消费者重试 Confirm模式简介 消息的confirm确认机制&#xff0c;是指生产者投递消息后&#xff0c;到达了消息服务器Broker里面的exchange交换机&#xff0c;则会给生产者一个应答&#xff0c;生产者接收到应答&#xff0c;用来确定这条消息是否正常的发送到Broker…

适合企业的跨隔离网文件摆渡的四种方式及优缺点

在当今的信息化时代&#xff0c;数据是企业的重要资产&#xff0c;如何有效地管理和传输数据&#xff0c;尤其是跨隔离网的大文件数据&#xff0c;是企业面临的一个挑战。跨隔离网文件摆渡是指在不同安全等级或网络环境的计算机之间传输文件的过程。 目前&#xff0c;市场上常见…

知识图谱01——ubuntu22.04 neo4j安装配置

环境&#xff1a;ubuntu22.04 以上参照自 目录 下载安装包新建conda虚拟环境启动neo4j错误处理 远程配置文件修改可能出现的错误 远程启动python远程访问(下面内容还未尝试&#xff0c;先写) 下载安装包 进入网站https://neo4j.com/deployment-center/#community 由于是ubunt…