`
znhyz1
  • 浏览: 157993 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

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文件

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

    3、CreateDataSet方法

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

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

   

//创建字段名表
CDataSet.FieldDefs.Clear;
with CDataSet.FieldDefs.AddFieldDef do
begin
 Name := 'Name';
 Size := 10;
 DataType := ftString;
end;
with CDataSet.FieldDefs.AddFieldDef do
begin
 Name := 'Age';
 DataType := ftInteger;
end;

//动态创建数据集
 CDataSet.CreateDataSet;
//激活和打开该数据集
 CDataSet.Open;

    4、Open方法

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

    5、LoadFromFile和SaveToFile

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

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

   

CDataSet.SaveToFile('C:\Windows\ZHU\Test.cds');

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

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

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

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

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

  

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

 

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

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

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

 

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

    1、动态索引

   

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
   if (not column.Field is Tblobfield) 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设计表达试
     调用

   

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赋值(从另一个数据集取值)

    

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

    或者

   

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

    7、附加数据取得

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

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

     (1)sql内容为空

    

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

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 保存目前为止数据状态,可以恢复到这个状态

   

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,实现自动容错和负载平衡。

     

分享到:
评论

相关推荐

    Delphi7调C#Webservice用返回ClientDataSet XML格式数据

    在Delphi中,我们可以通过定义数据字段、关联字段类型和数据源,使ClientDataSet与XML数据匹配。一旦XML数据被加载到ClientDataSet,就可以进行查询、编辑和过滤等操作。 5. **错误处理和调试**:在实际应用中,...

    delphi ClientDataSet数据集转 JSON

    网上看了一些转的方法都有漏洞下面直接上代码

    ClientDataSet的过滤问题

    - 在Delphi中,默认情况下,字符串比较是大小写敏感的。如果在过滤条件中没有正确处理大小写问题,则可能导致过滤结果不准确。 - `ClientDataSet`提供了`FILTEROPTIONS`属性来控制过滤时的行为。其中`...

    Delphi下ClientDataSet使用例子

    摘要:Delphi源码,控件组件,ClientDataSet Delphi环境下的ClientDataSet使用例子。ClientDataSet是Delphi三层开发常用控件。通过此例子帮助那些初学者学会ClientDataSet的使用,简单易懂。演示打开本地文件、保存到...

    ClientDataSet动态建表的简单例子

    在IT领域,ClientDataSet(CDS)是一种在 Delphi 和 C++Builder 等RAD Studio环境中广泛使用的组件,用于处理离线数据。它允许开发者在应用程序中存储、编辑和过滤数据,而无需直接连接到数据库服务器。在这个...

    ClientDataSet数据更新,Delta解析,视图更新

    将ClientDataset的Delta数据打包成JSon字符串 可以将这个JSon字符串传递到服务端, 进行解码,生成更新的SQL语句. 主键更新. 建议主键使用GUID,这样更新数度快, SELECT可以多个表,但是要更新的字段不要AS成其他名字. ...

    DELPHI 11调用JAVA 接口

    使用`CreateJavaVM`函数初始化Java虚拟机(JVM),然后通过`FindClass`查找Java接口类,使用`GetMethodID`获取接口方法的ID,最后通过`CallObjectMethod`或`CallNonvirtualObjectMethod`来调用Java接口。 5. **传递...

    程序运行时,提示“Invalid parameter”错误

    Delphi 10.3 ,程序运行到DataModule2.ClientDataSet1.ApplyUpdates(0);语句时,提示“Invalid parameter”错误

    json操作库为Delphi.rar

    为了在Delphi中处理JSON数据,开发者通常会依赖第三方库,如本压缩包中提供的"JsonDataObjects.pas"和"superobject.pas"。 "JsonDataObjects.pas"可能是一个基于Delphi 7的JSON库,它提供了一系列类和方法来解析、...

    ClientDataSet_经典

    ### Delphi中ClientDataSet的应用详解 #### 一、概述 `ClientDataSet`是Delphi中一个重要的...无论是对于初学者还是有经验的开发人员而言,掌握`ClientDataSet`的使用方法都将极大地提高开发效率和应用程序的质量。

    深度解析ClientDataSet

    ClientDataSet(简称CDS)是Delphi数据库编程中的一种重要组件,它是从TDataSet派生出来的,常用于构建多层架构的客户端应用。与TTable和TQuery不同,CDS并不直接依赖BDE(Borland Database Engine),而是依赖于...

    DELPHI 主从表控制

    在Delphi中,实现主从表控制通常涉及到以下步骤: 1. **数据模型设计**:在数据库层面,需要定义好主从表的关系,通常是通过外键约束实现。例如,订单详情表有一个订单ID字段,它是订单表的外键。 2. **服务端设置...

    Delphi如何一次删除dbgrid多条记录的例子.rar

    Delphi演示如何一次删除网格数据表dbgrid中的多条记录,小技巧不过挺实用,希望对大家的Delphi编程有所帮助。以下是实现一次删除多条记录的相关代码供参考:  if DBGrid1.SelectedRows.Count >1 then s:= '真的要...

    delphi动态配置DBgrid列显示类

    1. **DBGrid组件**:DBGrid是Delphi中用于显示和编辑来自数据源(如TClientDataSet)的表格数据的可视化组件。它能够自动根据数据字段的数量和类型创建列,并且支持用户交互,如排序、过滤和编辑。 2. **...

    ClientDataSet XML

    总结来说,“ClientDataSet XML”项目演示了如何在Delphi中利用ClientDataSet组件和XML技术来构建一个离线账目管理系统。这涉及到XML数据的读取、操作和存储,以及CDS与用户界面组件的交互。这样的系统具有灵活性和...

    delphi多线程精品示例

    本示例库,"delphi多线程精品示例",提供了关于如何在Delphi中有效地管理和利用多线程的高质量代码。 首先,我们来理解多线程的基本概念。线程是程序执行的最小单位,每个线程都有自己的执行上下文,包括程序计数器...

    ClientDataSet的使用

    在探讨“ClientDataSet的使用”这一主题时,我们首先需要理解ClientDataSet在Delphi或C++Builder等RAD Studio开发环境中扮演的角色。ClientDataSet是VCL(Visual Component Library)框架中的一个重要组成部分,主要...

    Delphi 从内存中修改数据源码示例

    在 Delphi 中,可以使用数组、记录(Record)、类(Class)等来表示内存中的数据。例如,如果我们要处理一个简单的数据库表,可以定义一个记录类型来模拟表的每一行: ```delphi type TPerson = record ID: ...

    Delphi统计行数和列数..rar

    以上代码片段展示了在Delphi中统计文本文件行数和列数,以及处理数据库行数和列数的基本方法。在实际应用中,你可能需要根据具体需求进行更复杂的错误处理和数据验证。记得在处理完文件和数据库连接后释放相关资源,...

    Delphi7的WebService与数据库

    小结 在本文中,我们详细介绍了 Delphi7 下开发WebService 如何使用数据库进行交互。在 Server 端,我们创建了一个 SoapDataModule,用于与数据库进行交互,并编写了对应的事件处理代码。在 Client 端,我们创建...

Global site tag (gtag.js) - Google Analytics