Delphi 多层数据库开发十一TClientDataSet

合集下载

delphi tgrid用法

delphi tgrid用法

Delphi是一种强大的集成开发环境(IDE),用于开发Windows评台的应用程序。

TGrid是Delphi中的一个重要组件,它可以帮助开发者快速、高效地创建和管理数据网格。

本文将介绍Delphi TGrid的基本用法,帮助读者更好地理解和运用这一组件。

一、TGrid简介TGrid是Delphi中的一个控件,用于显示表格状的数据。

它可以方便地展示数据库查询结果或其他数据集,支持用户进行排序、筛选和编辑操作。

TGrid的灵活性和强大功能使其成为Delphi开发中的重要组件之一。

二、TGrid的基本属性1. Title属性TGrid中的Title是用来显示列标题的,可以通过设置该属性来定义每一列的标题名称。

2. DataSource属性TGrid需要和一个数据源组件关联,用于显示数据。

通过设置DataSource属性,TGrid可以与数据源进行关联,实现数据的绑定和显示。

3. Options属性TGrid中的Options属性可以设置一些显示和功能选项,比如是否显示边框、是否可以编辑、是否可以多选等。

三、TGrid的基本操作1. 数据绑定需要创建一个数据集(DataSet),可以是TClientDataSet、TADOQuery等数据集组件。

将数据集和数据源(TDataSource)组件进行关联。

将数据源与TGrid的DataSource属性进行关联,即可实现数据绑定。

2. 列定义通过设置TGrid的Title属性,定义每一列的标题名称。

可以通过代码设置,也可以通过在设计时进行设置。

3. 数据显示绑定好数据源之后,TGrid会自动显示数据。

可以在TGrid中进行滚动、排序、筛选等操作,与数据集进行交互。

4. 数据编辑若TGrid的Options属性中设置了可以编辑,那么用户可以直接在TGrid中进行数据的编辑操作。

编辑完成后,可以通过代码保存修改到数据源中。

四、TGrid的高级用法1. 数据过滤TGrid支持根据用户的输入进行数据过滤,可以根据指定条件进行数据的筛选操作。

delphi tgrid用法 -回复

delphi tgrid用法 -回复

delphi tgrid用法-回复Delphi TGrid是一个非常常用的控件,用于在Delphi程序中显示和编辑数据的表格。

它提供了丰富的功能,可以让我们轻松地实现数据的展示、排序和编辑等操作。

本文将一步一步地回答关于Delphi TGrid的用法。

第一步:创建TGrid控件在Delphi中,我们可以使用TGrid控件来实现表格的显示和编辑。

首先,我们需要在Delphi的窗体上放置一个TGrid控件。

可以通过在VCL界面上选择“Standard”分类下的“Grid”控件来放置一个TGrid控件。

第二步:设置TGrid属性TGrid控件的属性决定了它的外观和功能。

我们可以通过点击TGrid控件,在Object Inspector中设置相应的属性来满足我们的需求。

1. 设置行和列的数目:在TGrid控件的属性中,我们可以设置Rows属性来定义表格的行数,Cols属性来定义表格的列数。

2. 设置表格显示方式:在TGrid控件的Options属性中,我们可以设置显示方式,如定制大小、固定列宽、显示网格线等。

3. 设置表头:TGrid控件提供了FixedCols和FixedRows属性,用于设置表头的列和行。

通过设置FixedCols和FixedRows属性,我们可以将特定的列和行固定在表格上方,方便查看。

4. 设置单元格显示方式:我们可以设置默认的单元格显示方式,如文本对齐方式、是否允许编辑、颜色等。

可以通过使用TGrid控件的CellStyle 属性,为不同类型的单元格设置不同的样式。

5. 绑定数据源:使用TGrid控件,我们通常会将其绑定到一个数据源上,以显示和编辑数据。

可以通过设置TGrid控件的DataSource属性,将TGrid和数据源绑定起来。

第三步:设置数据源为了在TGrid控件中显示和编辑数据,我们需要将其与一个数据源绑定。

TGrid可以绑定到多种类型的数据源,包括TDataSet、TDataSource、TClientDataSet等。

简述delphi数据库开发工具的使用

简述delphi数据库开发工具的使用

简述delphi数据库开发工具的使用Delphi是一种广泛使用的开发工具,它具有强大的数据库开发功能。

在Delphi中,可以使用多种方法来访问和管理各种数据库,如Oracle、MySQL、SQL Server等。

创建数据库连接:在Delphi中,可以通过创建ADOConnection对象来连接数据库。

在此对象中,可以设置数据库类型、服务器名称、用户名、密码和数据库名称等信息。

连接数据库后,就可以使用ADOQuery或ADOTable 等组件来查询或修改数据库中的数据。

使用SQL语句查询数据:在Delphi中,可以使用SQL语句来查询数据库中的数据。

可以通过ADOQuery对象来构建SQL语句,并使用ExecSQL方法来执行查询。

查询结果可以通过TDataSet对象来获取。

使用数据集组件编辑和保存数据:在Delphi中,可以使用ADOTable或ADOQuery等数据集组件来编辑和保存数据。

通过设置这些组件的属性,可以将数据加载到内存中,并通过将数据编辑器绑定到这些组件来实现数据的可视化编辑。

编辑完成后,可以通过调用SaveChanges方法将更改应用到数据库中。

使用数据集提供程序:除了使用ADO组件来访问数据库外,Delphi还提供了多种数据集提供程序,包括BDE、dbExpress、FireDAC等。

这些提供程序可以使用不同的方法来连接和管理数据库,可根据需要选择使用哪种提供程序。

总结:在Delphi数据库开发中,可以使用多种方法来访问和管理数据库,包括创建数据库连接、使用SQL语句查询数据、使用数据集组件编辑和保存数据,以及使用数据集提供程序等。

这些功能让Delphi 成为一种功能强大的数据库开发工具。

C-S结构中成批保存CLIENTDATASET中的数据

C-S结构中成批保存CLIENTDATASET中的数据
Forms, Dialogs,Provider,DBClient,DB,Variants;
type
TSaveCDS = class (TObject)
private
Fileds: TStrings;
FProvider: TDataSetProvider;
procedure ReconcileError(DataSet: TCustomClientDataSet; E: EReconcileError;
finally
CDS.OnReconcileError:=nil;
end;
end;
Байду номын сангаас
procedure TSaveCDS.DataSetProviderUpdateData(Sender: TObject;DataSet:
TCustomClientDataSet);
for i:=1 to Fileds.Count-1 do
if Assigned(DataSet.FieldByName(Fileds[i])) then DataSet.FieldByName(Fileds[i]).ProviderFlags:=[];
end;
procedure TSaveCDS.ReconcileError(DataSet: TCustomClientDataSet; E:
Fileds.Clear;
Fileds.Text:=VarToStr(V);
if Fileds.Count<1 then Exit; //将不保存的传过来 ,在这个事件中解析
//这只是一种方法而已,当然也有其他的方式,如用BYTE数组打包到数据包中;请读者自已考虑实现了;

TClientDataSet的使用技巧

TClientDataSet的使用技巧
次数,-1表示无数次,使用simpleobjectbroker时常设为0,实现自动容错和负载平衡
(出处:)
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,所有记录
(2)使用Aggergates属性add设计表达试
调用
showmessage(floattostr(ClientDataSet1.Aggregates.Count));
showmessage(ClientDataSet1.Aggregates.Items[0].Value);
6.可以对data赋值(从另一个数据集取值)
ClientDataSet2.Data:=ClientDataSet1.Data;
ClientDataSet2.Open;
或者
ClientDataSet2.CloneCursor(ClientDataSet1,true);
ClientDataSet2.Open;
则:客户端ClientDataSet

多层数据库应用基于DelphiDataSnap方法调用的实现(二)更新数据集

多层数据库应用基于DelphiDataSnap方法调用的实现(二)更新数据集

多层数据库应用基于DelphiDataSnap方法调用的实现(二)更新数据集传统的数据集的读取和更新,是通过中间层的TDataSetProvider 来完成的。

TDataSetProvider负责从它上游的数据集读取数据生成Data包,再传给客户端;另一方面,在客户端提交更新时(TClientDataSet.ApplyUpdates),TDataSetProvider还负责解析上传的Delta包,并最终实现数据库的更新。

现在在我们当前的方法调用方式下,不能再通过TDataSetProvider.ApplyUpdates来自动完成更新了,但是,我们还可以借用TDataSetProvider解析Delta数据包的功能,手动生成SQL语句来完成数据库的更新。

手动更新看似复杂,实际上编码并不多,而且这种方式具有很大的灵活性,同时还解决了在传统方式下,多表联合查询不能完全自动更新的软肋。

下面来看看示例代码:中间层代码...interfaceusesSysUtils, Classes, DSServer, DBXOracle, FMTBcd, DB, SqlExpr, WideStrings, Provider,CodeSiteLogging, DBClient;type{$METHODINFO ON}TServerMethods1 = class(TDataModule)SQLConnection1: TSQLConnection;SQLDataSet1: TSQLDataSet;DataSetProvider1: TDataSetProvider;procedure DataSetProvider1BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet;DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean);private{ Private declarations }FOnDeltaRecordUpdate: TBeforeUpdateRecordEvent;procedure UpdateEmployeesDelta(Sender: TObject; SourceDS: TDataSet;DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;var Applied: Boolean);public{ Public declarations }function GetEmployeeFullName(EmployeeId: Integer): string;function GetEmployees: TDataSet;function UpdateEmployees(EMPDelta: OleVariant): Boolean;end;{$METHODINFO OFF}...implementation...procedureTServerMethods1.DataSetProvider1BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet;DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean);beginif Assigned(FOnDeltaRecordUpdate) thenFOnDeltaRecordUpdate(Sender, SourceDS, DeltaDS, UpdateKind, Applied);end;procedure TServerMethods1.UpdateEmployeesDelta(Sender: TObject; SourceDS: TDataSet;DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean);varSQLStr, Clause1, Clause2: string;I: Integer;beginApplied := False;case UpdateKind of{$REGION 'Process ukModify'}ukModify:beginwith DeltaDS dobeginfor I := 0 to Fields.Count - 1 doif not Fields[I].IsNull thenClause1 := Clause1 + ', ' + Fields[I].FieldName + '=:' + Fields[I].FieldName;Clause1 := System.Copy(Clause1, 2, Length(Clause1) - 1);SQLStr := 'UPDATE EMPLOYEES SET ' + Clause1 + ' WHERE EMPLOYEE_ID = :EMPLOYEE_ID';end;with SQLDataSet1 dobeginClose;CommandText := SQLStr;for I := 0 to DeltaDS.Fields.Count - 1 doif not DeltaDS.Fields[I].IsNull thenParamByName(DeltaDS.Fields[I].FieldName).Value := DeltaDS.Fields[I].Value;ParamByName('EMPLOYEE_ID').AsInteger := DeltaDS.FieldByName('EMPLOYEE_ID').OldValue;if (ExecSQL() = 0) then Abort;end;end;{$ENDREGION}{$REGION 'Process ukInsert'}ukInsert:beginfor I := 0 to DeltaDS.Fields.Count - 1 dobeginif not DeltaDS.Fields[I].IsNull thenbeginClause1 := Clause1 + ', ' + DeltaDS.Fields[I].FieldName;Clause2 := Clause2 + ', :' + DeltaDS.Fields[I].FieldName;end;end;Clause1 := System.Copy(Clause1, 2, Length(Clause1) - 1);Clause2 := System.Copy(Clause2, 2, Length(Clause2) - 1);SQLStr := 'INSERT INTO EMPLOYEES(' + Clause1 + ') VALUES(' + Clause2 + ')';with SQLDataSet1 dobeginClose;CommandText := SQLStr;for I := 0 to DeltaDS.Fields.Count - 1 doif not DeltaDS.Fields[I].IsNull thenParamByName(DeltaDS.Fields[I].FieldName).Value := DeltaDS.Fields[I].Value;if (ExecSQL() = 0) then Abort;end;end;{$ENDREGION}{$REGION 'Process ukDelete'}ukDelete:beginSQLStr := 'DELETE EMPLOYEES WHERE EMPLOYEE_ID = :EMPLOYEE_ID';with SQLDataSet1 dobeginClose;CommandText := SQLStr;ParamByName('EMPLOYEE_ID').AsInteger := DeltaDS.FieldByName('EMPLOYEE_ID').OldValue;if (ExecSQL() = 0) then Abort;end;end;{$ENDREGION}end;Applied := True;end;function TServerMethods1.UpdateEmployees(EMPDelta: OleVariant): Boolean;varErrorCount: Integer;begin//指定Employees的专有更新过程FOnDeltaRecordUpdate := UpdateEmployeesDelta;DataSetProvider1.ApplyUpdates(EMPDelta, 0, ErrorCount);Result := ErrorCount = 0;end;1、增加一个DataSetProvider1控件,让它与SQLDataSet1控件关联。

Delphi的多层数据库应用体系结构

Delphi的多层数据库应用体系结构

Delphi的多层数据库应用体系结构Delphi提出的MIDAS是把原来双层的数据连接访问放到了应用服务器上,客户端只剩下了执行文件和MIDAS.DLL,前台和后台服务器通过DCOM机制互相沟通。

其结构如图所示。

图MIDAS应用程序的结构1. 应用服务器的结构应用服务器的关键部件是TRemoteDataModule(远程数据模块),它提供了IAppServer 接口。

当客户程序与应用服务器建立了连接,就通过IAppServer接口来获得数据集提供者列表(list of providers)。

TRemoteDataModule组件是一个支持双重接口的自动化服务器,这种类型的远程数据模块适合于DCOM, HTTP, Sockets通讯方式。

远程数据模块可以作为容器,但只能放置非可视化的组件。

另外,远程数据模块上一般要放一个或几个TDataSetProvider或TProvider构件来提供IProvider接口。

TDataSetProvider组件存在于应用服务器端的远程数据模块中,用于连接数据模块中的数据集,并向客户端发送数据。

2. 客户端的结构对于最终用户来说,多层体系结构中的客户程序与两层体系结构中的应用程序没有什么区别,在结构上,客户程序仍然通过标准的数据控件与用户交互。

但与单机模式应用程序不同的是,多层体系结构中的客户程序是通过应用服务器提供的IAppServer接口获得数据的,也通过IAppServer接口申请更新数据。

在客户程序中,MIDAS连接组件TDispatchConnection扮演着极其重要的角色。

不同的MIDAS连接组件使用不同的通讯协议将客户端连接到一个远程应用服务器,以获取一个IAppServer接口服务,然后获取数据集提供者列表。

通常使用TDispatchConnection派生的组件:(1)TDCOMConnection组件使用DCOM将客户端连接到一个远程应用服务器。

Delphi TClientDataSet原理浅析

Delphi TClientDataSet原理浅析

Delphi TClientDataSet原理浅析(转自大富翁--bingege 的KeyLife富翁笔记)KeyWord:clientdataset datasetprovider delphiDelphi做为一个快速应用开发工具,深受程序员的喜爱。

其强大的组件功能,让程序员能够轻松、高效地完成常见的界面开发、数据库应用等功能。

然而,帮助的相对缺乏,使得许多组件的功能并不为人们正确地使用,究其原因,仍然是认识上的问题。

对于MIDAS开发中的核心部件,TClientDataSet和TDataSetProvider,由于资料的缺乏,人们在网上大多谈论的是李维的书籍内容。

我有幸在BDN上见到了Cary Jensen的Professional Developer系列文章,详细阐述了DELPHI的数据库开发技术。

现节选出其中的ClientDataSet部分,与大家共同分享。

ClientDataSet是一个功能强大的类,通过在内存中模拟表格,实现了其它数据集组件所不具备的强大功能。

以往只在Delphi和C++ Builder企业版中才提供这个组件,如今,Borland的全部产品(包括最新的Kylix)都集成了TClientDataSet组件。

TClientDataSet从类的继承关系上来看,是TDataSet这个抽象类的子类,所以我们可以在TDataSet 这个抽象层次上对其进行我们熟悉的操作,比如导航、排序、过滤、编辑。

要注意的是,TClientDataSet 使用了一种全新的技术,它将所有的数据均放在内存中,所以TClientDataSet是个只存在内存中的“虚拟表”,因此对数据库的操作是非常快的。

在PIII 850,512MB的机器上对十万条记录进行建索引的操作,花费的时间少于半分钟。

与一般的数据集组件不同,TClientDataSet使用的技术比较特别,本着高速度、低存储需求的原则,TClientDataSet的内部使用了两个数据存储源。

Delphi数据库编程-第11章 使用DataSnap开发多层数据库

Delphi数据库编程-第11章  使用DataSnap开发多层数据库

2. 建立客户端应用程序
建立客户端应用程序的步骤如下 : (1)建立一个新的应用程序(Application). (2)根据连接所使用的协议来选定一个或几个DataSnap 连接组件(如TDCOMConnection,TSocket Connection, TWebConnection)并添加到数据模块中. (3)设置DataSnap连接组件的属性来定位到应用服务器 所在的计算机(ComputerName,Address和Port等)和 应用服务器(ServerName,URL等). (4)把一个或几个TClientDataSet组件放到数据模块上, 设置RemoteServer属性指定一个DataSnap连接组件,设 置ProviderName属性指定应用服务器上的 TDataSetProvider组件. (5) 把一个TDataSource组件放到数据模块上,设置它 的DataSet属性指定TClientDataSet组件.再为应用程序 中的窗体添加相应的数据控制组件,设置数据控制组 件的DataSource属性为该TDataSource组件名称 .
2. 断开连接 断开连接的方法主要有以下5种. (1)把TClientDataSet的Active属性设置为False. (2)将DataSnap连接组件的Connected属性设置为False. (3)关闭客户端程序. (4)将DataSnap组件删除. (5) 修改DataSnap连接组件的ServerName,ServerGUID, ComputerName,Host,Address等属性. 注意:与应用服务器的连接将要断开之前会触发 BeforeDisconnect事件,连接真正断开之后,会触发 AfierDisconnect事件.
11.3.3 在客户端建立和断开与应用服务器连接的方法 1. 建立连接 建立连接的方法主要有以下两种. (1)把TClientDataSet的Active属性设置为True. (2)把DataSnap连接组件的Connected属性设置 为True. 注意:在与应用服务器建立连接之前,将会触发 BeforeConnect事件.当建立了与应用服务器的 连接后,将会触发AfterConnect事件.

DELPHI数据控件TclientDataSet的详细说明

DELPHI数据控件TclientDataSet的详细说明

DELPHI数据控件TclientDataSet的详细说明与TTable、TQuery一样,TClientDataSet也是从TDataSet继承下来的,它通常用于多层体系结构的客户端。

TClientDataSet最大的特点是它不依赖于BDE(Borland Database Engine),但它需要一个动态链接库的支持,这个动态链接库叫DBCLIENT.DLL。

在客户端,也不需要用TDatabase构件,因为客户端并不直接连接数据库。

由于TClientDataSet是从TDataSet继承下来的,所以,它支持诸如编辑、搜索、浏览、纠错、过滤等功能。

由于TClientDataSet 在内存中建立了数据的本地副本,上述操作的执行速度很快。

也正是由于TClientDataSet并不直接连接数据库,因此,客户程序必须提供获取数据的机制。

在Delphi4中,TClientDataSet有三种途径获取数据:.从文件中存取数据。

.从本地的另一个数据集中获取数据。

.通过IProvider接口从远程数据库服务器获取数据。

在一个客户程序中,可以同时运用上述三种机制获取数据。

1、浏览和编辑数据和其他数据集构件一样,可以用标准的数据控件显示由TClientDataSet引入的数据集,当然,这需要借助于TDataSource 构件。

由于TClientDataSet是从TDataSet继承下来的,所以,凡是其他数据集构件支持的功能,TClientDataSet构件也大致具备。

不同的是,TClientDataSet能够在内存中建立数据的副本,因此,TClientDataSet比其他数据集构件增加了一些特殊的功能。

1.1、浏览数据可以用标准的数据控件显示由TClientDataSet引入的数据集。

在运行期,可以调用诸如First、GotoKey、Last、Next和Prior等函数来浏览数据。

TClientDataSet也支持书签功能,可以用书签来标记某条记录,以后就可以方便地找到这条记录。

clientdataset 用法

clientdataset 用法

clientdataset 用法影响ClientDataSet处理速度的一个因素TClientDataSet是Delphi开发数据库时一个非常好的控件。

有很强大的功能。

我常常用ClientDataSet做MemoryDataSet来使用。

还可以将ClientDataSet的数据保存为XML,这样就可以做简单的本地数据库使用。

还有很多功能就不多说了。

在使用ClientDataSet 的过程中关于怎样提高处理速度这个问题,我就我个人的一点点体会和大家分享一下。

通常情况下我们一般都是用...ClientDataSet--&gt;DataSource--&gt;DBComponent这样的结构,处理数据的时候就直接操作ClientDataSet。

但是大多DBComponet都会立即响应ClientDataSet的变化。

如果你是向ClientDataSet中插入很多数据时候,DBComponent 就要响应几次,而且响应过程根据不同的控件,速度,过程数量都不一样。

这样就影响了程序的执行效率。

所以在对ClientDataSet处理中,我是用ClientDataSet.DisableControls 和ClientDataSet.EnableControls方法:打开和关闭DBComponent与ClientDataSet的数据显示关系。

例如:ClientDataSet..DisableControls;...for I := 0 to 10000 dobeginClientDataSet.Append;...ClientDataSet.Post;end;...ClientDataSet.EnableControls...这样做以后你会发现处理速度比以前没有使用方法的时候有成倍的提高。

ClientDataSet的数据查找。

我所介绍的心得和技巧都是用ClientDataSet来做范例,也可以应用于其他的一些DataSet。

最新整理多层结构及其在Delphi中的实现.docx

最新整理多层结构及其在Delphi中的实现.docx

最新整理多层结构及其在Delphi中的实现多层结构及其在Delphi中的实现二层结构的退出在传统的二层C/S结构数据库应用中,客户端的机器执行应用程序,连接到后端的数据库服务器中存取应用系统所需资料,因为应用系统的企业逻辑都编写在客户端的应用程序中,造成客户端非常臃肿,且当应用系统需求改变时,所有在客户端的应用程序都必须改变,使维护成本太高。

OracleMSQL客户端1数据库服务器Sybase等图一2层C/S结构1.2多层结构的概念和特点为了解决这些问题,多层结构应用体系应运而生,即在传统的二层C/S模型中放入应用程序服务器。

应用程序服务器简单地说就是一个包含企业逻辑的应用程序,开发人员以一种特定的组件形态,如Microsoft /D ,CORBA对象,或EnterpriseJAVABean等,封装企业逻辑的程序代码,这种经过封装,能够执行特定企业功能的对象被称为“企业对象”,把这些企业对象分发到应用程序服务器中,开发人员在开发应用程序时就可以使用这些企业对象提供的服务。

多层结构的典型是三层结构,其基本思想是把用户界面与企业逻辑分离。

整体结构如图二所示。

客户端应用程序服务器远程数据库服务器(提供用户界面)(包含企业逻辑)(Oracle,MSQL,Sybase等DBMS)图二三层结构模型(1)客户端应用程序。

提供用户接口,主要功能是指导操作人员使用界面,输入数据,输出结果,并不具有企业逻辑,或只拥有部分不涉及企业核心的、机密的应用逻辑。

这样客户端就显的很廋,称为“廋”客户。

(2)应用程序服务器。

它是应用的主体,包含了企业中核心的及易变的企业逻辑(规划,运作方法,管理模型等),其功能即接受输入,处理后返回结果。

(3)远程数据库服务器。

即数据库管理系统(DBMS),负责管理对数据的读写和维护。

在更复杂的多层体系结构中,“廋”客户与远程数据库服务器之间可以加入更多的中间服务器,如加入一个中间安全服务器或中间转换服务器,用于对不同平台数据进行处理。

TClientDataSet手动修改Data数据

TClientDataSet手动修改Data数据

TClientDataSet手动修改Data数据TClientDataSet 手动修改Data数据使用TClientDataSet控件与DBGrid控件编辑显示数据窗口。

在设计过程中,ClientDataSet与DBGrid放置在两个不同的动方,手工连接。

由于ClientDataSet中的数据,部分在DBGrid中要求不显示。

在新增的行中,隐藏的列是必填字段,不能为空值,如果提交到数据库中,当然要报字段不能为空的错了。

要怎么才能手工加入隐藏的字段数据呢?ClientDataSet 有Data与Delte对象,前者为从数据源中取到内存的数据,后然是内存修改数据,等待更新到物理数据源中的数据。

Delte中的数据可以通过创建一个新的ClientDataSet 对象来得到Data,能知道有哪些数据是等待提交的。

但是新的ClientDataSet中的Data不能提交到前者ClientDataSet的Delte里。

这个方法行不通了。

Delte的只能用来查看数据,不能再修改。

再者,如果是修改的数据,那么有两条,怎么判断修改的数据也是个麻烦的事。

所以,Delte 这里行不通。

ClientDataSet有UpdateStatus方法,用来表述Data数据的Modify情况。

哈~~可往这里发展。

UpdateStatus的属性TUpdateStatus = (usUnmodified, usModified, usInserted, usDeleted);Data中的数据,前面讲了,是从数据库中取到的内存数据,但是问题又来了,新的Insert的数据,这里面没有。

怎么办?使用Post,提交到内存数据里面。

只要没有ApplyUpdates过,UpdateStatus的值都没有重置过。

if ClientDataSet.UpdateStatus = TUpdateStatus (usUnmodified, usModified, usInserted, usDeleted) then 来判断行的Modify状态吧。

delphi dataset 字段

delphi dataset 字段

一、介绍Delphi DatasetDelphi是一种基于对象的编程语言,用于开发Windows应用程序。

在Delphi中,Dataset是一种用来管理和存储数据的对象,它可以与数据库进行交互,实现数据的读取、写入和更新操作。

Dataset中的字段是指数据表中的列,它们定义了数据表中的各种属性和特征。

二、Delphi Dataset字段的类型在Delphi中,Dataset字段的类型包括字符串、数字、日期、布尔值等。

每种类型有不同的属性和方法,可以根据需要进行相应的操作。

字符串类型的字段可以进行字符串的拼接、查找和替换操作,而数字类型的字段可以进行数值的计算和比较。

三、Delphi Dataset字段的属性Dataset字段的属性包括字段名、字段类型、字段长度、字段精度、字段默认值等。

这些属性可以用来描述字段的特征和限制,以便在程序中进行相应的处理和验证。

字段长度可以限制字符串类型的字段的最大长度,字段精度可以限制数值类型的字段的小数位数。

四、Delphi Dataset字段的操作在Delphi中,可以通过Dataset对象的方法和属性对字段进行操作。

常见的操作包括读取字段值、设置字段值、验证字段值、获取字段属性等。

可以通过字段名来读取和设置字段值,通过字段属性来获取字段的类型和长度等信息。

五、Delphi Dataset字段的事件Dataset字段的事件是指在字段发生特定操作时触发的事件。

常见的事件包括字段值的改变、字段验证失败、字段获取焦点等。

通过处理这些事件,可以实现对字段值的进一步处理和验证,从而提高程序的健壮性和用户体验。

六、Delphi Dataset字段的应用Dataset字段在Delphi应用程序中有着广泛的应用。

它可以用来管理数据库中的数据,实现数据的增删改查操作,同时也可以用来进行数据的处理和展示。

在实际应用中,可以通过Dataset字段来实现对数据的灵活控制和操作,从而满足不同的业务需求。

delphiTstringsTCollection类

delphiTstringsTCollection类

delphiTstringsTCollection类delphi Tstrings 类(2010-05-13 14:50:19)引用xiaojinet 的 delphi Tstrings 类根据下标存取列表中的字符串是最常见的一种操作,用法示意如下:StringList1.Strings[0] := '字符串1';注意在Delphi中,几乎所有的列表的下标都是以0为底的,也就是说Strings[0]是列表中的第一个字符串。

另外,由于Strings属性是字符串列表类的默认属性,因此可以省略Strings,直接用下面的简便方法存取字符串:StringList1[0] := '字符串1';定位一个列表中特定的字符串的位置,可以使用IndexOf方法,IndexOf方法将会返回在字符串列表中的第一个匹配的字符串的索引值,如果没有匹配的字符串则返回-1。

比如我们可以使用IndexOf方法来察看特定文件是否存在于文件列表框中,代码示意如下:if FileListBox1.Items.IndexOf('TargetFileName') > -1 ...有一点不方便的是TStrings类没有提供一个方法可以查找除了第一个匹配字符串外其他同样匹配的字符串的索引,只能是自己遍历字符串列表来实现,这点不如C++中的模版容器类以及相关的模版算法强大和方便。

下面是一个遍历字符串列表的示意,代码遍历列表框中的所有字符串,并将其全部转化为大写的字符串:procedure TForm1.Button1Click(Sender: TObject);var Index: Integer;beginfor Index := 0 to ListBox1.Items.Count - 1 doListBox1.Items[Index] := UpperCase(ListBox1.Items[Index]);end;前面我们看到了,要想向字符串列表中添加字符串,直接使用Add方法就可以了,但是Add方法只能将字符串加入到列表的末尾,要想在列表的指定位置添加字符串,需要使用Insert方法,下面代码在列表的索引为2的位置添加了字符串:StringList1.Insert(2, 'Three');如果要想将一个字符串列表中的所有字符串都添加到另一个字符串列表中,可以使用AddStrings方法,用法如下:StringList1.AddStrings(StringList2);要想克隆一个字符串列表的所有内容,可以使用Assign方法,例如下面的方法将Combox1中的字符串列表复制到了Memo1中:Memo1.Lines.Assign(ComboBox1.Items);要注意的是使用了Assign方法后,目标字符串列表中原有的字符串会全部丢失。

delphi cxverticalgrid用法

delphi cxverticalgrid用法

delphi cxverticalgrid用法Delphi的CXVerticalGrid用法Delphi是一种强大的编程语言,广泛应用于Windows平台的软件开发。

在Delphi的组件库中,CXVerticalGrid是一种非常有用的控件,用于创建和管理垂直网格,使用户能够轻松地管理和展示数据。

CXVerticalGrid的主要特点是它可以自动创建行并填充数据,而无需手动创建和编辑数据。

它还支持对数据进行排序、筛选和编辑,并且可以根据需要自定义每个单元格的外观和行为。

以下是一些使用CXVerticalGrid的常见任务和用法。

1. 创建CXVerticalGrid控件在Delphi中,要使用CXVerticalGrid控件,首先需要在界面设计器中将其拖放到窗体上。

然后,可以通过调用一些方法和设置一些属性来自定义控件的外观和行为。

2. 绑定数据到CXVerticalGrid一旦创建了CXVerticalGrid控件,下一步就是将数据绑定到网格中。

可以通过使用DataSet或DataController来实现数据的绑定。

例如,可以使用TClientDataSet来绑定数据,然后使用DataController的DataSet属性将数据设置到CXVerticalGrid中。

3. 对数据进行排序和筛选CXVerticalGrid提供了灵活的排序和筛选功能,使用户能够按需对数据进行操作。

可以使用GridModeOptions属性来配置网格的排序和筛选选项,然后通过调用Sort和Filter方法来实现排序和筛选。

4. 编辑数据CXVerticalGrid允许用户进行数据的编辑,包括添加、修改和删除数据。

可以使用Options属性来配置网格的编辑选项,例如,可以设置ReadOnly属性来禁止用户编辑数据。

另外,可以使用AddNewRecord和DeleteSelection方法来添加和删除记录。

5. 自定义单元格外观通过使用Styles属性和其子属性,用户可以轻松地自定义CXVerticalGrid中每个单元格的外观。

DELPHI分布式技术--ClientDataSet

DELPHI分布式技术--ClientDataSet

DELPHI分布式技术--ClientDataSet秦义江;赵青;刘建军【期刊名称】《内蒙古石油化工》【年(卷),期】2006(032)005【摘要】@@ TClientDataSet从类的继承关系上来看,是TDataSet这个抽象类的子类,所以我们可以在TDataSet这个抽象层次上对其进行我们熟悉的操作,比如导航、排序、过滤、编辑.要注意的是,TClientDataSet使用了一种全新的技术,它将所有的数据均放在内存中,所以TClientDataSet是个只存在内存中的"虚拟表",因此对数据库的操作是非常快的.与一般的数据集组件不同,TClientDataSet使用的技术比较特别,本着高速度、低存储需求的原则,TClientDataSet的内部使用了两个数据存储源.【总页数】1页(P60)【作者】秦义江;赵青;刘建军【作者单位】中原油田分公司采油二厂;中原油田分公司采油二厂;中原油田分公司采油二厂【正文语种】中文【中图分类】TE6【相关文献】1.用Delphi结合ADO开发Excel数据服务器应用技术(一)——Delphi结合ADO 的方法和数据连接 [J], 闫海忠2.基于ClientDataSet的数据库应用系统设计 [J], 张国权;彭江平3.dbExpress及ClientDataSet应用结构中异常处理研究 [J], 彭江平4.在ClientDataSet中动态创建查找字段的实现方法 [J], 刘铭;阮国龙5.Heavy Metals in Soft Tissues of Short-Beaked Common Dolphins(&lt;i&gt;Delphinus delphis&lt;/i&gt;) Stranded along the Algerian West Coast [J], Larbi Doukara Kamel;Bouslah Yahia;Bouderbala Mohammed;Boutiba Zitouni因版权原因,仅展示原文概要,查看原文内容请购买。

Delphi中运行期间在TClientDataSet中实现统计字段和计算字段

Delphi中运行期间在TClientDataSet中实现统计字段和计算字段

Delphi中运⾏期间在TClientDataSet中实现统计字段和计算字段1、统计字段的实现第⼀步⽤如下格式创建TClientDataSetwith ClientDataSet1 doBeginwith FieldDefs.AddFieldDef doBeginDataType=ftInteger;Name='A';End;with FieldDefs.AddFieldDef doBeginDataType=ftInteger;Name='B';End;with FieldDefs.AddFieldDef doBeginDataType=ftInteger;Name='C';End;CreateDataSet;Active:=true;End;第⼆步、定义统计字段的计算⽅法Function GetAggVale(CDS:TClientDataSetp;const AggExpression:String;const AggField:String;const AggGroupLevel:Integer=0):Variant;varAddUp:TAggregate;BeginAddup:=TAggregate.Create(CDS.Aggregates,CDS);tryAddup.Expression:=Format(AggExpression,[AggField]);AddUp.GroupingLevel:=AggGroupLevel;Addup.active:=True;Result:=Addup.Value;FinallyAddup.Free;End;End;在ClientDataSet1的AfterPost事件中实现ShowMessage(GetAddValue(ClientDataSet1,'Sum(%s)','A',0);以上是简单说明了⼀下统计字段的简单运⽤,实际上在Delphi中的TClientDataSet还可以实现很多中统计。

Delphi三层开发小技巧TClientDataSet的Delta妙用

Delphi三层开发小技巧TClientDataSet的Delta妙用

Delphi三层开发小技巧TClientDataSet的Delta妙用Delphi三层开发小技巧:TClientDataSet的Delta妙用Delphi做三层开发时,很多人都会在客户端放一个TClientDataSet,中间层远程数据模块就对应放一个TDataSetProvider,然后再连起来.其实这种方法很烦琐,而且程序痈肿不甘,不好维护.我们都知道TClientDataSet的Delta属性记录了数据的所有修改,应用它我们就可以方便的实现一个单表更新的通用方法.首先,在中间层添加一个方法,就叫ApplyUpdates吧.方法定义如下:function ApplyUpdates(constUpdateTable:String;Delta:Variant;out err:String):Boolean;参数UpdateTable是指要更新的表名,Delta是指传过来的TClientDataSet的Delta属性,如果更新错误err返回错误的内容.下面实现这个方法,首先在DataModule上放一个Query,Query连上Connection,然后再放一个TDataSetProvider 连Query.代码如下:function TRoDm.ApplyUpdates(constUpdateTable:String;Delta:Variant;out err:String):Boolean; const sql='select * from %s where 1&lt;&gt;1';var sqlstr:string;ErrCount:Integer;beginResult:=False;sqlstr:=Format(sql,[UpdateTable]);tryConn.BeginTrans;Query.Close;Query.sql.text:=sqlstr;Query.open;Provider.ApplyUpdates(Delta,-1,ErrCount);Result:=ErrCount=0;if Result thenmitTranselse Conn.RollbackTrans;excepton E:Exception dobeginConn.RollbackTrans;err:=E.Message;end;end;end;到此,通用的更新方法已经完成了.不过客户端的ClientDataSet还不能查询显示数据,因此,还要写一个查询方法:function QuerySQL(const sqlstr:string;out Data:Variant;out err:String):Boolean;参数sqlstr就是要持行的查询语句,Data返回查询结果,错误时err返回错误消息QuerySQL实现代码如下:function TRoDm.QuerySQL(const sqlstr:string;outData:Variant;out err:String):Boolean;beginResult:=False;tryQuery.close;Query.sql.text:=sqlstr;Query.sql.Open;Data:=Provider.Data;Result:=True;Excepton E:Exception doerr:=E.Message;end;end;到这里,中间层的代码已经完了,客户端的调用就简单了.比如客户端有个数据模块DM,上面放一个DcomConnection 或者SocketConnection,名叫Conn.例如,我们现在要做一个商品管理的功能,在窗体上放一个TClientDataSet叫Cds,放DataSource,DBGrid等,设置好相应的属性.然后在窗体创建(Create事件)时查询回所有数据,代码如下:const sql='select * from xxxx';var Data:Variant;err:String;beginif Dm.Conn.AppServer.QuerySQL(sql,Data,err) then Cds.Data:=Dataelse MessageBox(self.handle,pchar('查询数据出错:'+err),'错误',MB_OK+MB_ICONERROR);end;然后还有"添加","修改","删除"按扭,代码都和我们平时操作一样,比如"添加"按扭的代码:cds.append;cds.fieldbyname('xxx').asinteger:=xxx;//....cds.post;修改,删除也这样写.不过现在还有个小问题是,这个表的主键的生成问题,这里我们不能用自增主键,要自己自己生成主键,这样你还得在中间层写一个中间层生成主键的方法,在"增加"按扭时生调用生成主键,然后再上面的操作.这里不再多说.增删改完后,这时的数据还在客户端的内存里,想保存到远程的中间层服务器就要用到我们刚才的方法了,下面就是"保存"按扭下的代码:var err:string;beginif cds.ChangeCount=0 then exit;//数据没改变就不用提交了if Dm.Conn.AppServer.ApplyUpdates('xxx',cds.Delta,err) then//xxx就是表名了beginMessageBox(self.handle,'保存成功!','提示',MB_OK+MB_ICONINFORMATION);cds.MergeChangeLog;//合并所有改变的数据end else MessageBox(self.handle,pchar('保存出错:'+err),'错误',MB_OK+MB_ICONERROR);end;到此,这篇文章也讲完了.用这个方法,那些单表的基础数据更新还可以写成一个祖先类,只要加一个取得更新表名的虚方法,比如:function TableName:string;virtual;然后其后代只要override这个方法,返回各自的表名,其他的一句代码都不用写.分类: 三层。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

以下是多层数据库开发十一:TClientDataSet的正文内容,本文是网友投稿或本站会员创作,不代表本站观点:第十一章TClientDataSet与TTable、TQuery一样,TClientDataSet也是从TDataSet继承下来的,它通常用于多层体系结构的客户端。

TClientDataSet最大的特点是它不依赖于BDE(Borland Database Engine),但它需要一个动态链接库的支持,这个动态链接库叫DBCLIENT.DLL。

在客户端,也不需要用TDatabase构件,因为客户端并不直接连接数据库。

由于TClientDataSet是从TDataSet继承下来的,所以,它支持诸如编辑、搜索、浏览、纠错、过滤等功能。

由于TClientDataSet在内存中建立了数据的本地副本,上述操作的执行速度很快。

也正是由于TClientDataSet并不直接连接数据库,因此,客户程序必须提供获取数据的机制。

在Delphi 4中,TClientDataSet有三种途径获取数据:.从文件中存取数据。

.从本地的另一个数据集中获取数据。

.通过IProvider接口从远程数据库服务器获取数据。

在一个客户程序中,可以同时运用上述三种机制获取数据。

11.1 浏览和编辑数据和其他数据集构件一样,可以用标准的数据控件显示由TClientDataSet引入的数据集,当然,这需要借助于TDataSource构件。

由于TClientDataSet是从TDataSet继承下来的,所以,凡是其他数据集构件支持的功能,TClientDataSet构件也大致具备。

不同的是,TClientDataSet能够在内存中建立数据的副本,因此,TClientDataSet比其他数据集构件增加了一些特殊的功能。

11.1.1 浏览数据可以用标准的数据控件显示由TClientDataSet引入的数据集。

在运行期,可以调用诸如First、GotoKey、Last、Next和Prior等函数来浏览数据。

TClientDataSet也支持书签功能,可以用书签来标记某条记录,以后就可以方便地找到这条记录。

对于TTable、TQuery等数据集构件来说,只能读RecNo属性来判断当前记录的序号。

对于TClientDataSet构件来说,还可以写RecNo属性,使某一序号的记录成为当前记录。

11.1.2 CanModify属性TDataSet的CanModify属性用于判断数据集中的数据是否可以修改。

CanModify属性本身是只读的,也就是说,数据是否能够修改不取决于应用程序。

不过,TClientDataSet构件有其特殊性,因为TClientDataSet已经把数据在内存中建立了副本,因此,应用程序可以决定是否允许修改数据。

如果不允许用户修改数据,只要把ReadOnly属性设为True,此时,CanModify属性肯定返回False。

与其他数据集构件不同,修改TClientDataSet构件的ReadOnly属性时,不需要事先把Active属性设为True。

11.1.3 取消修改TClientDataSet传输数据的基本单位称为数据包,当前的数据包可以由Data属性来访问。

不过,用户对数据的修改并不直接反映到Data属性中,而是临时写到一个日志即Delta属性中,这样做的好处是以后随时可以取消修改。

不过,这里要说明一点,尽管用户的修改并没有反映到Data,当用户在数据控件中看到的却是最新修改的数据。

如果一条记录被反复修改了多次,用户看到的只是最新的数据,但日志中却记载了多次。

要取消上一次的修改,调用UndoLastChange函数。

UndoLastChange需要传递一个布尔类型的参数叫FollowChange,如果FollowChange参数设为True,光标就移到被恢复的记录上,如果FollowChange参数设为False,光标仍然在当前记录上。

ChangeCount属性返回日志中记载的修改次数。

如果一条记录被反复修改了多次,每调用一次UndoLastChange能够逐级取消上一次的修改。

UndoLastChange只能取消上一次的修改,如果想一下子取消所有的修改,首先要选择一个记录,然后调用RevertRecord。

RevertRecord将从日志中取消所有对当前记录的修改。

TClientDataSet还有一个SavePoint属性,它能把当前的编辑状态保存起来,以后随时可以返回当时的状态。

例如,可以这样保存当前的状态:BeforeChanges := ClientDataSet1.SavePoint;以后,可以这样来恢复当时的状态:ClientDataSet1.SavePoint := BeforeChanges;应用程序可以保存多处状态,可以恢复其中一个状态,不过,一旦某个状态被恢复,在其之后的状态就无效。

如果要一下子取消日志中记载的所有修改,可以调用CancelUpdates函数。

CancelUpdates 将把日志清空,取消所有的修改。

如果LogChanges属性设为False,用户对数据的修改就会直接反映到Data属性中。

11.1.4 合并修改要把日志中记载的修改合并到Data属性中,有两种方式,具体使用哪一种方式,取决于应用程序获取数据的机制。

不过,不管是哪种机制,合并后,日志自动被清空。

对于一个从文件中获取数据的程序来说,只要调用MergeChangeLog函数,就把日志中记载的修改合并到Data属性中。

不用担心其他用户同时修改了数据。

对于一个从应用服务器获取数据的程序来说,就不能调用MergeChangeLog来合并数据,而要调用ApplyUpdates函数,ApplyUpdates会把日志中记载的修改传递给应用服务器,待应用服务器成功地把数据更新了数据库服务器后,才会合并到Data属性中。

11.1.5 纠错TClientDataSet支持纠错功能。

一般情况下,需要自己建立纠错规则,以便对用户输入的数据进行纠错。

此外,如果获得了IProvider接口的话,还可以从远程服务器引入纠错规则。

有时候,客户端可能需要暂时禁止纠错,因为客户端从应用服务器检索数据是分阶段进行的,在所有的数据检索完毕之前,有些纠错规则很可能会报错。

要暂时禁止纠错,可以调用DisableConstraints,要重新允许纠错,可以调用EnableConstraints 函数。

DisableConstraints和EnableConstraints实际上都是作用于一个内部的计数。

11.2 索引使用索引有这么几个好处:.在数据集中定位记录比较快。

.能够在两个数据集之间建立Lookup或Master/Detail关系。

.可以对记录排序。

在多层体系结构中,当客户程序从应用服务器检索数据时,它同时获得了默认的索引。

默认的索引叫DEFAULT_ORDER,可以使用这个索引排序,但不能修改或删除这个索引。

除了默认的索引外,TClientDataSet还对日志中记载的记录自动建立了一个副索引叫CHANGEINDEX。

与DEFAULT_ORDER一样,不能修改或删除这个副索引。

另外,还可以使用数据集中已建立的其他索引,或者自己建立索引。

11.2.1 创建一个新的索引要创建一个新的索引,可以调用AddIndex。

AddIndex需要传递若干个参数:一是Name参数,用于指定索引名。

在运行期切换索引时需要用到索引的名称。

二是Fields参数,它是一个字符串,用于指定索引中的字段名,彼此之间用分号隔开。

三是Options参数,用于设置索引的选项,包含ixDescending元素表示按降序排列,包含ixCaseInsensitive元素表示大小写不敏感。

四是DescFields参数,它也是一个字符串,用于指定若干个字段名,这些字段将按照降序排列。

五是CaseInsFields参数,它的作用与DescFields参数类似,包含在CaseInsFields参数中的字段将对大小写不敏感。

六是GroupingLevel参数,用于指定分组级别,其值不能超过索引中的字段数。

下面的代码创建了一个索引:If Edit1.Text <> '' and ClientDataSet1.Fields.FindField(Edit1.Text) thenBeginClientDataSet1.AddIndex(Edit1.Text+'Index',Edit1.Text,[ixCaseInsensitive],'','',0);ClientDataSet1.IndexName := Edit1.Text + 'Index';End;为了避免创建一个索引,可以临时用IndexFieldNames属性来指定若干个字段,让数据集按这些字段排序。

11.2.2 删除和切换索引要删除一个先前创建的索引,可以调用DeleteIndex并指定要删除的索引名称。

注意:DEFAULT_ORDER和CHANGEINDEX不能删除。

如果建立了多个索引,可以任意选择其中的一个索引,这就要用到IndexName属性。

11.2.3 用索引把数据分组选择了一个索引后,数据集将自动按其中的字段进行排序。

这样,临近的记录往往在关键字段上含有相同的值。

例如,假设有一个表是这样的:SalesRep Customer OrderNo Amount1 1 5 1001125012 3 2001 267521110234200可以看出,SalesRep字段的值有重复的。

对于SalesRep字段的值为1的来说,Customer 字段的值也有重复的。

这就是说,可以按SalesRep字段分组,进而再按Customer字段分组。

显然,这里的分组级别是不同的,按SalesRep字段建立的分组属于第一级,按Customer字段建立的分组属于第二级。

实际上,分组级别取决于字段在索引中的顺序。

TClientDataSet可以决定是否按照分组级别来显示记录的值。

例如,也许想以下面这种形式显示数据:SalesRep Customer OrderNo Amount1151002502320067521110234200要判断当前记录某一级的什么位置,可以调用GetGroupState函数。

GetGroupState函数需要传递一个参数,用于指定分组级别。

11.3 计算字段与其他数据集一样,也可以在TClientDataSet建立的数据集中增加计算字段。

计算字段的值是基于同一个记录中的其他字段计算出来的。

在其他数据集中,只要用户修改了数据或当前记录发生改变,就会触发OnCalcFields 事件,换句话说,计算字段的值就被计算一次。

相关文档
最新文档