Delphi WebService Soap 一次提交多个 ClientDataSet 的简单方法

Delphi实现WebService带身份认证的数据传输 在WebService中,用户身份认证信息可以在客户端通过soap头(soapheader)进行传送。在WebService服务端的编写中,需要对soap头进行处理,这个处理过程就是提取SoapHeader中的用户认证信息进行验证。下面就来看看在Delphi中这个身份认证是如何实 阅读详情

用 Delphi 做的 WebService 程序,服务器端有一个 SoapDataModule,里面是连接数据库的 DataSet 和 DataSetProvider,客户端的 ClientDataSet.ProviderName 对应的就是服务器端的 DataSetProvider.

简单的情况下,客户端提交对数据的修改,使用 ClientDataSet1.ApplyUpdates(0); 的代码就可以提交。

但是,如果有多个表需要提交,而且多个表需要在一个数据库事务里面提交,也就是其中一个表提交不成功,则数据库事务回滚,则不能用 ClientDataSet1.ApplyUpdates 的方式了。因为调用两次这个方法,服务器端是创建了两次 SoapDataModule 的实例,没法把两次提交放在一个数据库事务里面。

因此,这里就需要额外写一个服务器端的方法,在这个方法里,一次性提交多个来自客户端的数据。对于 ClientDataSet 来说,提交修改的数据,就是提交 ClientDataSet.Delta。这个 Delta 是一个 OleVariant 类型的数据。

一次提交多个,如何把多个打包到一起?一个方法就是利用 Variant 的 Array 也是 Variant 的特性。代码如下:

在客户端:

procedure TForm1.Button4Click(Sender: TObject);
var
  ADeltas: Variant;
  V1, V2: Variant;
begin
  V1 := VarArrayOf([ClientDataSet1.ProviderName, ClientDataSet1.Delta]);
  V2 := VarArrayOf([ClientDataSet2.ProviderName, ClientDataSet2.Delta]);

  ADeltas := VarArrayOf([V1, V2]);

  SoapConnection1.Connected := False;   // SoapConnection1 要用来调用接口方法,必须:1. 先设置 Connected 为 False; 2. 设置其 SOAPServerIID 为接口的 IID,3. Connected设置为 True
  SoapConnection1.SOAPServerIID := '{965990D3-EBF5-E9CB-017E-A9043479592F}';
  SoapConnection1.Connected := True;
  (SoapConnection1.RIO as ItestSoap).SaveDataSet(ADeltas);
end;

在服务器端,对应的接口方法:

procedure TtestSoap.SaveDataSet(ADeltas: Variant);
var
  i, ErrorCount: Integer;
  S: string;
  VDelta: Variant;
  AProvider: TDataSetProvider;
begin
  //测试把几个 ClientDataSet 的 Delta 打包到一起发送到服务器端,一个方法提交。目的是可以集中到一个数据库事务里面;
  //方法是采用 VarArrayOf() 的方法把几个不同的参数打包到一个 var array 里面,在服务器端通过对 var array 进行解析来获得。
  for I := VarArrayLowBound(ADeltas, 1) to VarArrayHighBound(ADeltas, 1) do
  begin
    S := Adeltas[i][0];
    VDelta := ADeltas[i][1];

    AProvider := Self.FindProvider(S);
    if Assigned(AProvider) then
    begin
      AProvider.ApplyUpdates(Vdelta, 0, ErrorCount); //ErrorCount 是提交的错误数字。检查这个数字就可以回滚事务
    end;
  end;
end;

说明一下:

上述方法里面,ADeltas 是一个 Variant 类型的数据,但它实际上是一个 VarArray 类型的数据。因此可以对它做数组的操作;

然后,它的数组元素,当然也是 Variant 类型的数据;而这个 Variant 类型的数据,同样是一个数组,这个数组的第一位(索引编号为 0),是字符串类型的值,代表的是该 ClientDataSet 对应的 DataSetProvider 的 Name;数组的第二位是 Variant 类型的数据,是 ClientDataSet 的 Delta 数据。

备注:上述服务器端方法里面有个函数是通过 DataSetProvider 的名字字符串,搜索对应的 DataSetProvider 对象实例,代码如下:

function TtestSoap.FindProvider(const ProviderName: string): TDataSetProvider;
var
  C: TComponent;
begin
  C := FindComponent(ProviderName);
  if Assigned(C) then
  begin
    if (C is TDataSetProvider) then
    begin
      Result := TDataSetProvider(C);
    end;
  end;
end;

简单说,就是 Variant 数组,可以包含多个数据类型不同的数据,而它本身也是一个 Variant 类型的数据。类似于把多个不同的数据打包到一起,作为一个参数,从客户端传递给服务器端。然后在服务器端可以通过对数组的操作,把多个不同的数据从一个 Variant 类型的数据里面提取出来。

Delphi三层开发小技巧:TClientDataSet的Delta妙用 Delphi做三层开发时,很多人都会在客户端放一个TClientDataSet,中间层远程数据模块就对应放一个TDataSetProvider,然后再连起来.其实这种方法很烦琐,而且程序痈肿不甘,不好维护.我们都知道TClientDataSet的Delta属性记录了数据的所有修改,应用它我们就可以方便的实现一个单表更新的通用方法 立即下载

相关推荐

Delphi编写soap服务器与客户端程序

Delphi编写soap服务器与客户端程序

Delphi 多层数据库无状态模式下 ClientDataSet 分段读取服务器端记录的方法

unit UDataModule3; {------------------------------------------------------------------------------ ClientDataSet 分段获取数据。有状态模式下,服务器端 select 出来100条,如果设置 ClientDataSet.PacketRecords := 10, 则 ClientDa

pcplayer的博客 2486

几率大的Redis面试题(含答案)

本文的面试题如下: Redis 持久化机制 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题 热点数据和冷数据是什么 Memcache与Redis的区别都有哪些? 单线程的redis为什么这么快 redis的数据类型,以及每种数据类型的使用场景,Redis 内部结构 redis的过期策略以及内存淘汰机制【~】 Redis 为什么是单线程的,优点 如何解决redis的并发竞争key问题 Red...

睶 38万+

delphi webserver soap头(soap header)信息传送

在做一个webserver 接口的时候,需要在soap header传送登录后的SessionId,通常delphi生成接口后传送的XML里是不会有包括header数据信息的,这就只能是写代码增加上去。 那么,首先我们需要先自行定义一个类: const IS_TEXT = $0020; {一个常量,也很重要} //这个定义了 Header信息基础类 TSessionIdHeader = class(TSOAPHeader) private FValue: string;

tanqth的专栏 1万+

莫比乌斯反演

本文从算法竞赛和数论角度出发,系统介绍了狄利克雷卷积与莫比乌斯反演的核心概念。首先定义了数论函数及其基本性质,重点阐述了狄利克雷卷积的代数结构(交换环)和关键恒等式(如μ*1=ε)。随后通过卷积视角简化了莫比乌斯反演的证明过程。最后将理论提升至抽象代数层面,揭示这些数论工具本质上是偏序集关联代数在整除关系下的特例,其中莫比乌斯函数对应Zeta函数的逆元。全文展现了数学概念从具体到抽象的升华过程,为理解这些工具提供了更深刻的代数视角。

aichitang2024的博客 391

AD元件库构建及维护之——DbLib公共元件库的使用教程

AD元件库构建及维护之——DbLib元件库的使用教程

qq_43105486的博客 2万+

网络数据请求方式(SOAP和JSON)

从网络上进行数据的请求主要有SOAP方式和JSON方式,下面是我在看天气预报的例子时比较的两种方式的不同,在这里Mark一下。 SOAP方式: 使用SOAP获得天气预报支持的省直辖市信息 //封装soap请求消息 NSString *soapMessage = [NSString stringWithFormat: @"\n" "\n" "\n"

wyw0715218的专栏 2239

学Simulink--基础储能管理场景实例:基于Simulink的储能SOC均衡控制策略仿真

本文完成了基于 Simulink 的储能 SOC 均衡控制策略仿真,实现了:✅掌握并联系统 SOC 分化机理✅构建基于电流重分配的主动均衡架构✅验证均衡对系统可用容量的显著提升✅实现 SOC 偏差 < 2% 的高精度控制。

amy_mhd的博客 85

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

    转自:http://www.west263.com/info/html/chengxusheji/delphi/20080411/65524.html   这应该不算是什么技巧,估计有数据库方面程序的DELPHI程序员都知道;本来没有写想到需要把它写成一篇贴子,但前不久看个别刚入门的兄弟的代码时。才发展他们还在刀耕火种,为此才想把它写出来算是对入门的兄弟们的一点帮助,让大侠们见笑了...

注重长远 天天积累 cqujsjcyj 200

手把手教你学PCIE(11.3)--pcie的认证和合规性测试

PCIe 设备的认证和合规性测试是确保设备正常工作和达到预期性能的关键步骤。通过使用 PCI-SIG 提供的测试工具和第三方测试工具,可以全面评估 PCIe 设备的物理层、链路层、事务层和互操作性,确保设备符合行业标准和规范。

MHD0815的博客 1359

Python爬虫应对Cloudflare防护:5秒盾+Turnstile验证码实战(AST反混淆+指纹模拟,成功率95%)

Cloudflare 5秒盾+Turnstile验证码的防护核心,是通过“前端JS挑战+多维度指纹校验”确认请求来源的真实性。用AST反混淆还原CF的验证逻辑,避免执行无用代码导致的验证失败;基于真实浏览器采集指纹,确保指纹维度100%匹配真人环境;结合轻量级JS引擎和自动化工具,模拟完整的浏览器执行环境。该方案的绕过成功率可达95%(剩余5%主要是IP或请求频率导致的风控),适用于绝大多数部署CF防护的网站。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1716

论Delphi和DotNet的WebService实现技术

Tag: Delphi .net WebService 最近公司有个系统升级,老系统为delphi所编写;老系统为传统的C/S两层结构,有一个瓶颈就是我们的客户端经常需要从数据库刷新数据 ,而且这些数据都是一样的,这极大地影响了系统效率,在系统升级时我们考虑使用WebService解决这一瓶颈;初步想法是需要刷新数据时由 WebService中间层去数据库提取数据,所有的客户端都到中间层拿刷新后的数据,这样就避免了所有的客户端都直接去操作数据库提取同样的 数据。但是用什么平台实

ddv_9527的专栏 1350

《YOLO11改进有效涨点》 专栏目录 | 目前已有100+篇内容,内含各种Head检测头、损失函数Loss、Backbone、Neck等创新点改进【持续更新】

YOLO11改进专栏目录,YOLO11改进目录

kay_545 1万+

Delphi7 的 WebService 与 数据库

Server 端:SoapDataModule中加入 ADOConnection1、ADODataSet1、DataSetProvider1;DataSetProvider1的DataSet设置为ADODataSet1;ADODataSet1的CommandText设置为空,Connection设置为ADOConnection1。DataSetProvider1的DataRequest事件:f

迷茫 2943

从零开始学 AUTOSAR:深入浅出 SAE J1939 诊断通信管理器(J1939Dcm)深度完整版

SAE J1939 是美国汽车工程师学会制定的重型车辆 CAN 总线通信标准,覆盖卡车、客车、工程机械、农机、船舶等,是商用车领域的 “通用语言”。基于CAN 2.0B 扩展帧(29 位 ID)(车规主流)PGN(参数组号)+ SPN(可疑参数号)核心标准:J1939-21:数据链路层(CAN 帧格式、地址声明)J1939-71:应用层(普通信号、报文)诊断层(核心!J1939Dcm 依据)J1939-81:网络管理(地址管理、节点检测)

getusushu的博客 115

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

用Delphi 实现WebService

一编写服务程序 第一步:File----->New----->Other------>WebServices----->Soap Server Application 选择ISAPI/NSAPI Dynamic Link Library然后确定。生成一个框架。后面的大部分原代码都需要自己手工添加 第二步:定义一个接口单元。先通过向...

weixin_34092370的博客 2821

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Delphi7的WebService与数据库

Server 端:  SoapDataModule中加入 ADOConnection1、ADODataSet1、DataSetProvider1;DataSetProvider1的DataSet设置为ADODataSet1;ADODataSet1的CommandText设置为空,Connection设置为ADOConnection1。  DataSetProvider1的DataReque

tomliks的专栏 969

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Delphi编写WebService体会

源:Delphi编写WebService体会 Dispatch: 派遣,分派 Invoke: 调用 Invokable: 可调用接口 TReomtable: WebService中自定义类都是继承自该类 TSOAPAttachment: Attachment:附件,一种流类型,可以返回流数据 CGI:(EXE) ISAPI:(DLL)Base64编码: us...

weixin_30316097的博客 131

DelphiXE7中创建WebService(服务端+客户端)

相关资料: http://www.2ccc.com/news/Html/?1507.html http://www.dfwlt.com/forum.php?mod=viewthread&tid=922 DelphiXE7新建WebService具体操作:1.打开“DelphiXE7”->“File”->“New”->“Other”2.“New Items...

weixin_34358092的博客 906

我在delphi7下调用微软的Web Services的心得.(可以返回数据集)

操作步骤如下: 1、在VS.2003下编写WebServices,代码如下:  1         [WebMethod] 2         public string HelloWorld() 3         { 4             return "Hello World"; 5         } 6  7         [WebMethod] 8         pu...

cfeers 235

Soap/Web Service执行效率的思考

 以下内容都是针对李维老师的《Delphi 6/Kylix2--soap/Web Service程序设计篇》一书中的实例的,我的程序框架和他做的基本一致,只是我没有进行压缩,功能上已经全部实现。遇到的问题如下:1.李维老师在书中如例子中的Client更新原始代码如下: IQueryDataFind.UpdateData(XTToCompressSoapPacket1(DZSBFileC

小宇飞刀的BLOG 1317

[原创] 分布式系统框架搭建 PartThree-Delphi 露脸

我们的WebService 做成了,调用也成功了 .net 调用 .net 的东西很容易,但是我个人很不喜欢微软。写WebService 有很多可以实现 java delphi  ruby 等..客户端也是。根据实际情况,选择即可!但是在桌面客户端的话,我比较偏向与Delphi.桌面客户端谁也不愿意背着个.net freamwork 到处跑!接下来玩点有意思的,使用.net 的We

PeerLessSoul 1920
上一篇: 使用 Helper class 访问一个类的私有变量
下一篇: Delphi SOAP WebService 服务器端多个 SoapDataModule 的做法
pcplayer
博客等级 码龄26年 633粉丝 284原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值