`
hurunhui
  • 浏览: 10744 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

一个ClientDataset的Delta与XML相互转换的文章:

 
阅读更多

一个ClientDataset的Delta与XML相互转换的文章:


大家都知道TClientDataSet的Delta属性保存数据集的变化,但是Delta是OleVariant类型的属性,这样如果用Delphi写Webservice,就有需要把它转成XML,特别是其他语言也要用这个Webservice的时候,因为如果Delta能和XML相互转换,Delta包的结构就是透明的了。而TClientDataSet却没有提供DeltaXML这样的属性,之前在网上找了一下,发现网上的都是把Delta赋给另一个TClientDataSet的Data,然后再通过XMLData返回XML,但这样为了一个简单的功能就得多创建一个对象实例,感觉很不好,于是研究一下TClientDataSet的源码,终于完成了Delta与XML相互转换的函数,代码如下:

unit uDelta;

interface

uses DBClient,DSIntf,VarUtils,ActiveX;

function DeltaToXML(Delta:OleVariant):String;
function XMLToDelta(XMLData:String):OleVariant;

implementation

procedure Check(FDSBase:IDSBase;Status: DBResult);
var
ErrMsg: array[0..2048] of Char;
begin
if Status <> 0 then
begin
    FDSBase.GetErrorString(Status, ErrMsg);
    raise EDBClient.Create(ErrMsg, Status);
end;
end;

function DeltaToXML(Delta:OleVariant):String;
var
FDSBase: IDSBase;
DataPacket: TDataPacket;
VarPacket: OleVariant;
begin
CreateDbClientObject(CLSID_DSBase, IDSBase, FDSBase);
SafeArrayCheck(ActiveX.SafeArrayCopy(VarToDataPacket(Delta), DataPacket));
Check(FDSBase,FDSBase.AppendData(DataPacket, True));
FDSBase.SetProp(dspropXML_STREAMMODE, xmlON);
Check(FDSBase,FDSBase.StreamDS(DataPacket));
DataPacketToVariant(DataPacket, VarPacket);
Result := VariantArrayToString(VarPacket);
//FreeDataPacket(DataPacket);
end;

function XMLToDelta(XMLData:String):OleVariant;
var Delta:OleVariant;
    DataPacket: TDataPacket;
    FDSBase: IDSBase;
begin
Delta:=StringToVariantArray(XMLData);
SafeArrayCheck(SafeArrayCopy(VarToDataPacket(Delta), DataPacket));
CreateDbClientObject(CLSID_DSBase, IDSBase, FDSBase);
Check(FDSBase,FDSBase.AppendData(DataPacket, True));
FDSBase.SetProp(dspropXML_STREAMMODE, xmlOFF);
Check(FDSBase,FDSBase.StreamDS(DataPacket));
DataPacketToVariant(DataPacket, Result);
//FreeDataPacket(DataPacket);
end;

end.

 

分享到:
评论

相关推荐

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

    本篇文章将详细探讨如何在Delphi 7环境中调用C#编写的Web服务,并处理返回的ClientDataSet XML格式数据。Delphi 7是一款经典的面向对象编程工具,而C# Web服务则是一种基于.NET Framework的分布式应用程序,两者之间...

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

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

    Delphi FireDac Delta 记录操作日志 与 Delta转SQL

    - 你可以创建一个事件监听器,每当 FDMemTable 发生改变时,就记录下 Delta,并将其转换为 SQL 语句保存到日志文件中。这样,日志文件就包含了每次操作的原始 SQL,便于后续审计和问题排查。 - 在需要时,例如在...

    ClientDataSet XML

    本项目“ClientDataSet XML”着重展示了如何利用CDS与XML数据源进行交互,实现一个简单的账目管理系统。在Delphi中,XML作为一种灵活的数据交换格式,常用于保存和传输结构化数据。下面我们将深入探讨这个主题。 ...

    ClientDataSet_经典

    下面给出一个简单的案例,演示如何使用`ClientDataSet`从文件读取数据,并将其复制到另一个`ClientDataSet`实例中。 ```delphi uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,...

    ClientDataSet动态建表的简单例子

    源码可能包括一个窗体,上面放置了一个ClientDataSet组件,以及对应的事件处理代码来执行建表、插入数据和过滤操作。通过查看和分析这些源码,你可以更深入地理解ClientDataSet的工作原理及其在实际应用中的用法。 ...

    ClientDataSet的过滤问题

    当涉及到数据筛选时,开发者经常会遇到各种各样的问题,其中一个常见的问题是关于`ClientDataSet`的过滤功能实现不准确或出现异常的情况。本文将详细探讨这一问题,并提供解决方案。 #### 二、问题描述 根据描述,...

    ClientDataSet的使用

    ClientDataSet是VCL(Visual Component Library)框架中的一个重要组成部分,主要用于本地数据处理,它能够独立于服务器运行,为用户提供高效的数据操作体验。 ### ClientDataSet基本概念 ClientDataSet组件是一种...

    Delphi通过WebService访问数据库

    ClientDataSet1.XMLData := ls_Service.Buf_GetADONetToCDSXml('Northwind',ls_Table,'select * from '+ls_Table); end; 2.更新数据 procedure TForm1.Button2Click(Sender: TObject); var ls_Table: string; ls_...

    搜索和过滤ClientDataSet.flv

    搜索和过滤ClientDataSet.flv

    delphi ClientDataSet数据集转 JSON

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

    深度解析ClientDataSet

    通过直接赋值ClientDataSet1.Data = ClientDataSet2.Data,可以将一个CDS的数据复制到另一个CDS,这在数据同步、备份和恢复等场景中非常有用。这样的数据复制操作使得数据可以在多个CDS之间自由流动,提高了数据处理...

    json_TO_clientdataset_JSON

    json_TO_clientdataset_JSONUtil包.rar 整理了一下 JSON 轉CLIENTDATASET 功能 相關單元文件, 從網絡下載的工具類: SUPEROBJECT.PAS, myUnicode.pas , uJSONDB.pas, uDeltaToSQL.pas, superxmlparser.pas 測試用例...

    Delphi下ClientDataSet使用例子

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

    delphi动态配置DBgrid列显示类

    2. **ClientDataSet组件**:ClientDataSet是一种轻量级的本地数据存储,它不直接连接到数据库,而是通过数据提供者(如TDataSource)与数据源通信。它可以缓存数据,支持离线操作,并且能模拟服务器端的复杂查询。 ...

    DataSnap通过json上传clientdataset数据集到服务端并解释

    DataSnap是Embarcadero Technologies提供的一种中间件技术,用于构建分布式应用程序,它允许客户端与服务器之间进行高效的数据交换。 描述中提到的“DataSnap通过json上传数据集到服务端并解释”进一步强调了这一...

    json_TO_clientdataset_JSONUtil包.rar

    json_TO_clientdataset_JSONUtil包.rar 整理了一下 JSON 轉CLIENTDATASET 功能 相關單元文件, 從網絡下載的工具類: SUPEROBJECT.PAS, myUnicode.pas , uJSONDB.pas, uDeltaToSQL.pas, superxmlparser.pas 測試...

    Delphi json转Cds

    2. **创建CDS**:手动创建一个TClientDataSet实例,定义其字段结构,使其与JSON对象中的数据匹配。假设我们的JSON对象有"Name"、"Age"和"City"三个属性,我们可以这样创建CDS: ```delphi var ClientDataSet: ...

Global site tag (gtag.js) - Google Analytics