- 浏览: 2060283 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (1409)
- asp/asp.net学习 (241)
- oracle (10)
- delphi (295)
- java (27)
- pb (1)
- 每日点滴 (49)
- 学习方法 (40)
- 思想方面 (104)
- C语言 (5)
- C++ (1)
- 代码重构经验 (5)
- 软件工程 (3)
- 数据库 (99)
- 英语学习 (3)
- mysql (1)
- 该关注的网站或者网页 (42)
- 总结 (7)
- 要去做的事情 (33)
- 算法 (1)
- 网络方面 (29)
- 随感 (96)
- 操作系统 (36)
- UML (12)
- 常用工具的使用 (55)
- 脚本 (7)
- 汇编 (62)
- 数据结构 (2)
- 财务 (38)
- 语文作文 (16)
- 法律 (1)
- 股票 (88)
最新评论
-
devwang_com:
可以,学习了~~
列出文件夹下所有文件夹的树形结构--Dos命令 tree的使用 -
hvang1988:
不管用啊 frxrprt1.PreviewForm.Pare ...
fastReport预览时嵌入到别的窗体 -
00915132:
我也有这个疑问,非常 感 谢
left join加上where条件的困惑 --SQL优化 -
zhuyoulong:
学习了,高效读书
软件架构师要读的书 -
nTalgar:
非常感谢分享!
Application.ProcessMessages用法:
转自:http://www.west263.com/info/html/chengxusheji/delphi/20080411/65524.html
这应该不算是什么技巧,估计有数据库方面程序的DELPHI程序员都知道;本来没有写想到
需要把它写成一篇贴子,但前不久看个别刚入门的兄弟的代码时。才发展他们还在刀
耕火种,为此才想把它写出来算是对入门的兄弟们的一点帮助,让大侠们见笑了;
我们都知道TCLIENTDATASET有把对它其中的数据所做的修改记录下来的功能;如果需要还可以将
修改回复到以前的某个状态,而且结合DATASETPROVIDER还可能自动完成改动到SQL映射,将改动成批提交到数据库中
这个特性对于写数据库程序来说非常有用。其实我所说的保存CLIENTDATASET的数据也是利用这个特性来实现的; 版权申明:本站文章均来自网络.
代码很简单: !
unit uCDSSave; 对真正的成功者来说,不论他的生存条件如何,都不会自我磨灭
interface .
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls,
Forms, Dialogs,Provider,DBClient,DB,Variants; 。
type
TSaveCDS = class (TObject)
private
Fileds: TStrings;
FProvider: TDataSetProvider;
procedure ReconcileError(DataSet: TCustomClientDataSet; E: EReconcileError;
UpdateKind: TUpdateKind; var Action: TReconcileAction);
public
constructor Create;
destructor Destroy; override;
procedure CDSSave(CDS:TClientDataSet;TableName,keyFiled,
NoSaveFileds:String;KeyUpdate:Boolean=False);
procedure DataSetProviderUpdateData(Sender: TObject;DataSet:
TCustomClientDataSet);
procedure SetCDS(KeyFiled,NoSavefields:string;KeyUpdate:Boolean=False);
property Provider: TDataSetProvider read FProvider write FProvider;
end;
implementation
{
*********************************** TSaveCDS ***********************************
}
constructor TSaveCDS.Create;
begin
inherited Create;
Fileds:=TStringList.Create;
FProvider:=TDataSetProvider.Create(nil); 。
FProvider.UpdateMode:= upWhereKeyOnly ;
FProvider.Options:=FProvider.Options [poAllowMultiRecordUpdates];
end; 版权申明:本站文章均来自网络,如有侵权,请联系028-86262244-215,我们收到后立即删除,谢谢!
destructor TSaveCDS.Destroy;
begin
FreeAndNil(FProvider);
FreeAndNil(Fileds);
inherited Destroy;
end; 。
procedure TSaveCDS.CDSSave(CDS:TClientDataSet;TableName,keyFiled,
NoSaveFileds:String;KeyUpdate:Boolean=False);
var
ErrCount: Integer;
begin
CDS.CheckBrowseMode;
if CDS.ChangeCount<1 then Exit;
CDS.OnReconcileError:= ReconcileError; //调用保存前客户代码应该先调用SetCDS指定保存的信息;
// SetCDS(CDS,keyFiled,NoSaveFileds,KeyUpdate);
// FProvider.ApplyUpdates(CDS.Delta,0,ErrCount)
try
CDS.Reconcile(FProvider.ApplyUpdates(CDS.Delta,0,ErrCount));
finally
CDS.OnReconcileError:=nil;
end; .
end; 。
procedure TSaveCDS.DataSetProviderUpdateData(Sender: TObject;DataSet:
TCustomClientDataSet);
var
i: Integer;
v: OLEVariant;
KeyUpdate: Boolean;
begin
varClear(v);
V:=DataSet.GetOptionalParam(''''KEYUPDATE'''');
if not (VarIsNull(V) or VarIsClear(V)) then KeyUpdate:=true
else KeyUpdate:=False;
V:=DataSet.GetOptionalParam(''''KEYFILED'''');
if Assigned(DataSet.FindField(VarToStr(V))) then
if KeyUpdate then
DataSet.FindField(VarToStr(V)).ProviderFlags:=[pfInupdate,pfinKey]
else
DataSet.FindField(VarToStr(V)).ProviderFlags:=[pfinKey];
V:=DataSet.GetOptionalParam(''''NOSAVEFILEDS'''');
if (VarIsNull(V) or VarIsClear(V)) then Exit;
Fileds.Clear;
Fileds.Text:=VarToStr(V);
if Fileds.Count<1 then Exit; //将不保存的传过来 ,在这个事件中解析
//这只是一种方法而已,当然也有其他的方式,如用BYTE数组打包到数据包中;请读者自已考虑实现了;
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:
EReconcileError; UpdateKind: TUpdateKind; var Action: TReconcileAction);
begin
Raise E; //只是简单的抛出例外,如有自己的处理请自己实现了;
end; !
procedure TSaveCDS.SetCDS(KeyFiled,NoSavefields:string;KeyUpdate:Boolean=False);
begin
CDS.SetOptionalParam(''''TABLE_NAME'''' ,TableName,true);//指定要存入的表名;
CDS.SetOptionalParam(''''KEYFILED'''' ,keyFiled,true);//指定要主建名;
CDS.SetOptionalParam(''''NOSAVEFILEDS'''' ,NoSaveFileds,true);//指定不要存入的字段列表;
if KeyUpDate then
CDS.SetOptionalParam(''''KEYUPDATE'''' ,1,true);// 指定主健是否要更新字段列表 .
end; .
.
end. ...
.
这段代码不一定是最优的实现,主要是想给出一个思路,用时可以根据实际情况改动,例如:本来程序是用的MIDAS来实现,则
就可以直接用CLIENTDATASET连接中间的TDATASETPROVIDER来实现;有一点要特别说明的是我发现在D5时,在前端的CLIENTDATASET
中直接设定各个字段的PROVIDERFLAG后不会被打包到Delta传给TDATASETPROVIDER;D7中好象也有此问题,不知是我看错了,还是D的BUG;
否则就不用那么麻烦自已写代码来处理了;
发表评论
-
form打开时的关闭代码
2011-10-25 20:29 1577摘自:http://topic.csdn.n ... -
TUpdateSQL更新问题 提示Update Failed
2011-08-29 20:26 1240摘自:http://topic.csdn.net/u/200 ... -
图解如何用Eurekalog跟踪程序错误
2011-08-12 07:28 943图解如何用Eurekalog跟踪程序错误 摘自:h ... -
VirtualBox 复制VDI 并能创建新的虚拟机
2011-07-21 11:14 2741摘自:http://www.nonabyte.net/how- ... -
截获所有异常 不报错
2011-07-12 16:52 1242摘自:http://media.ccidnet.c ... -
delphi exe程序以及DLL程序如何在模块内部获得各自的路径
2011-07-11 16:38 1307delphi Exe程序以及DLL程序如何在模块内部获得各自的 ... -
Delphi文本文件读写
2011-07-11 14:55 1252Delphi文本文件读写 (2008-10-31 1 ... -
Delphi自定义的消息的使用
2011-05-31 14:12 2317阅:已验证,可通过; 摘自:http://blog.1 ... -
怎么查看OutputDebugString输出的信息?debugview
2011-05-25 16:02 3835网上很多说用debugview查看,我自己写了一个程序,里面用 ... -
Delphi里查看该变量的内存值
2011-05-25 13:32 1126Delphi里查看该变量的内存值:Run==>Evalu ... -
注册表操作 写入autorun启动项,键值为本程序的全路径
2011-05-20 15:40 1826procedure TForm4.Button2Click ... -
报说包frx7和frxdb7都包含了某个单元的错误
2011-05-11 09:59 10271. 问题描述:在安装FastReport3的时候,安装到- ... -
Delphi中使用ListView和TreeView的Item中的Data可能被忽略的内存泄漏
2011-05-03 14:34 1465摘自:http://blog.csdn.net/g ... -
WM_USER的说明 用户消息ID
2011-04-28 10:46 1689WM_USER 摘自:http://baike.bai ... -
ToolButton不能改变大小
2011-04-28 10:38 3464问题描述:ToolButton不能改变大小? 问 ... -
Delphi里TOOLBAR 上的button的caption为什么显示不出来啊
2011-04-20 17:55 1769Delphi里TOOLBAR 上的button的caption ... -
delphi指针简单入门
2011-04-11 21:42 1159摘自:http://topic.csdn.net/t/2003 ... -
Delphi中paramstr的用法 应用程序间传递数据
2011-04-01 14:33 2106Delphi中paramstr的用法 应用程序间传递数据 ... -
Delphi中的THashedStringList对象 --大数据量时
2011-04-01 13:54 5150Delphi中的THashedStringLi ... -
inherited Create(AOwner); 和直接写inherited有区别吗
2011-03-26 15:44 1325摘自:http://zhidao.baidu.com/que ...
相关推荐
对于ClientDataSet,它是一种内存中的数据库表,可以通过XML数据加载或保存。我们可以先将XML数据转换为TXMLDocument,然后利用ClientDataSet的LoadFromXML或SaveToXML方法来加载或保存数据。 4. **使用...
- 类似于文件操作,`ClientDataSet`还支持从流中读取和保存数据。这可以通过`LoadFromStream`和`SaveToStream`函数实现,只需要传入相应的流对象即可。 **3. 数据复制** - `ClientDataSet`还支持强大的数据复制...
网上看了一些转的方法都有漏洞下面直接上代码
在Delphi开发环境中,`ClientDataSet`是一种常用的数据处理组件,主要用于客户端的数据操作与管理。当涉及到数据筛选时,开发者经常会遇到各种各样的问题,其中一个常见的问题是关于`ClientDataSet`的过滤功能实现不...
总结起来,这个"ClientDataSet动态建表的简单例子"展示了如何利用Delphi或C++Builder中的ClientDataSet组件动态构建数据结构,插入数据,并进行本地过滤。对于理解和使用ClientDataSet进行离线数据处理的开发者来说...
将ClientDataset的Delta数据打包成JSon字符串 可以将这个JSon字符串传递到服务端, 进行解码,生成更新的SQL语句. 主键更新. 建议主键使用GUID,这样更新数度快, SELECT可以多个表,但是要更新的字段不要AS成其他名字. ...
4. **保存数据集**:使用`SaveToFile`方法将数据集的状态保存到文件中,以便后续加载使用。 5. **加载数据集**:可以通过`LoadFromFile`方法从文件中恢复数据集的状态,实现数据的持久化。 6. **绑定数据源和控件**...
标题 "DataSnap通过json上传clientdataset数据集到服务端并解释" 涉及到的是在IT领域中,特别是Delphi开发环境下,使用DataSnap框架将客户端的数据集以JSON(JavaScript Object Notation)格式发送到服务器的过程。...
1. **从文件中存取数据**:CDS可以使用LoadFromFile或LoadFromStream函数从文件或流中读取数据,相应地,也可以使用SaveToFile或SaveToStream将数据保存回文件或流。需要注意的是,这些函数只能处理之前使用...
XML(eXtensible Markup Language)是一种标记语言,用于描述数据结构。在账目管理的场景中,XML文件可以包含账户名、交易日期、金额等信息,每个记录以元素形式存在,元素之间通过层次结构关联。例如: ```xml ...
摘要:Delphi源码,控件组件,ClientDataSet Delphi环境下的ClientDataSet使用例子。ClientDataSet是Delphi三层开发常用控件。...演示打开本地文件、保存到文件、保存CDS和XML、显示远程数据、保存到远程服务器等功能。
搜索和过滤ClientDataSet.flv
首先,我们需要了解 Delphi 中的数据结构。在 Delphi 中,可以使用数组、记录(Record)、类(Class)等来表示内存中的数据。例如,如果我们要处理一个简单的数据库表,可以定义一个记录类型来模拟表的每一行: ```...
json_TO_clientdataset_JSONUtil包.rar 整理了一下 JSON 轉CLIENTDATASET 功能 相關單元文件, 從網絡下載的工具類: SUPEROBJECT.PAS, myUnicode.pas , uJSONDB.pas, uDeltaToSQL.pas, superxmlparser.pas 測試用例...
TclientDataSet是DELPHI数据控件中的一种重要组件,它继承自TDataSet,用于多层体系结构的客户端。与TTable、TQuery一样,TClientDataSet也可以用于浏览、编辑、搜索、纠错、过滤等数据操作。 TClientDataSet的最大...
- LoadFromFile和SaveToFile方法分别用于从文件加载数据集结构和数据,以及将数据集保存到文件。这两个方法类似于文档处理软件中的打开和另存为功能。 6. **数据操作方法** - TClientDataSet提供了一系列数据操作...
在本例中,使用了ClientDataset(简称cds)结合PacketRecords属性来实现数据分页。PacketRecords是一个整型属性,表示每次加载的数据包大小。当设置`FetchOnDemand:= false;`时,意味着数据将按照指定的数据包大小...
元数据是描述数据的数据,它在DBExpress中起到至关重要的作用,用于定义数据库结构和操作。本文将深入探讨如何在Delphi中结合DBExpress和元数据进行数据库操作,并通过实例来展示具体实现步骤。 首先,DBExpress的...
在Delphi编程环境中,添加、修改和删除是数据库操作中的基本功能,对于任何涉及数据库应用的项目都至关重要。本文将详细讲解如何在Delphi中实现这些功能,主要围绕以下几点展开: 1. 数据库组件的选择与配置 ...
此程序可以合并程序目录中“明细数据”文件夹中任何多个mdb数据,也可以使用密码(稍作修改,代码有注释),由于使用的是clientdataset,所以数据没有保存到表中,可以保存到本地xml文件中,可以不用"合并数据库.mdb...