DataSnap——利用TParams进行多表事务更新

服务端:

function TSVRDM.multUpdatesByPar(UpdateParam: TParams; out ErrMsg: string): OleVariant;
const
aSQL = 'Select * from %s where 1<>1';
var
i: Integer;
lQuery: TADOQuery;
lProvider: TDataSetProvider;
conn: TADOConnection;
ErrorCount, MaxErrors: Integer;
begin
Writeln(fguid + ':Mult-Table Update start ...');
conn := ConnPool.Lock(dbConnStr);
lQuery := TADOQuery.Create(NIL);
lProvider := TDataSetProvider.Create(nil);
Writeln(fguid + ': Start Transaction... ' );
conn.BeginTrans;
try
try
lQuery.Connection := conn;
lProvider.DataSet := lQuery;

for I := 0 to UpdateParam.Count-1 do begin
Writeln(fguid + ': Update Table ' + UpdateParam[i].Name);

lQuery.Close;
lQuery.SQL.Clear;
lQuery.SQL.Text := Format(aSQL, [UpdateParam[i].Name]);

result := lProvider.ApplyUpdates(UpdateParam[i].AsBytes, 0, ErrorCount);
ErrMsg := FErrMsg;
if ErrorCount > 0 then
raise Exception.Create(ErrMsg + '; TableName = '+UpdateParam[i].Name);
end;
conn.CommitTrans;
Writeln(fguid + ': Transaction commited... Update finished!' );
except
on E: Exception do
begin
conn.RollbackTrans;
Writeln(fguid + ':Transaction rollbacked! Update ERROR :' + E.Message);
end;
end;
finally
lProvider.Free;
lQuery.Free;
ConnPool.Unlock(conn);
FErrMsg := '';
end;

end;

客户端:

procedure TMyClient.btn1Click(Sender: TObject);
var
aParams: TParams;
aPar: TParam;
client: TDMClient;
ErrMsg: string;
begin

// TClientDataSet的Data和Delta可用TParam.AsBytes直接传递
aParams := TParams.Create(nil);
if ClientDataSet1.ChangeCount > 0 then
begin
aPar := aParams.CreateParam(ftVarBytes, '数据表1', ptInput);
aPar.AsBytes := ClientDataSet1.Delta;
end;

if ClientDataSet2.ChangeCount > 0 then
begin
aPar := aParams.CreateParam(ftVarBytes, '数据表2', ptInput);
aPar.AsBytes := ClientDataSet2.Delta;
end;
if aParams.Count = 0 then
exit;

client := TDMClient.Create(self.SQLConn.DBXConnection);
try
try
client.multUpdatesByPar(aParams, ErrMsg);
if ErrMsg <> '' then
raise Exception.Create(ErrMsg)
else
begin
ClientDataSet1.MergeChangeLog;
ClientDataSet2.MergeChangeLog;
end;
except
ON E: Exception do
begin
showmessage(E.Message);
end;
end;
finally
client.Free;

end;
end;

DataSnap——利用TParams进行多表事务更新的更多相关文章

  1. SQL Server 利用触发器对多表视图进行更新

    其步骤就是:利用update操作触发器产生的2个虚拟表[inserted]用来存储修改的数据信息和[deleted]表,然后将对应的数据更新到对应数据表中的字段信息中: 1.首先创建3个表: a.信息 ...

  2. 利用Flume将MySQL表数据准实时抽取到HDFS

    转自:http://blog.csdn.net/wzy0623/article/details/73650053 一.为什么要用到Flume 在以前搭建HAWQ数据仓库实验环境时,我使用Sqoop抽取 ...

  3. Oracle\MS SQL Server Update多表关联更新

    原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表 ...

  4. SDNLAB技术分享(四):利用ODL下发流表创建VxLAN网络

    邓晓涛,当前就职于江苏省未来网络创新研究院,是CDN团队的一名研发人员,主要从事SDN相关的研发相关工作.曾就职于三星电子于先行解决方案研发组任高级工程师.思科系统于云协作应用技术部(CCATG)任工 ...

  5. Oracle 两个表之间更新的实现

    Oracle 两个表之间更新的实现   来源:互联网 作者:佚名 时间:2014-04-23 21:39 Oracle中,如果跨两个表进行更新,Sql语句写成这样,Oracle 不会通过.查了资料,S ...

  6. (喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句

    (喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句 在我们RDIFramework.NET代码生成器中,有这样一个应用,就是通过数据库表自动生成表的CREA ...

  7. sqlserver多表连接更新

    一.MS SQL Server 多表关联更新 sql server提供了update的from 子句,可以将要更新的表与其它的数据源连接起来.虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据 ...

  8. 利用sql批量删除表,存储过程

    利用sql批量删除表,存储过程. 最近用godaddy的空间,由于系统里面的表多,一个个的删除很麻烦,就网上搜集了一下解决方法. 给大家分享一下: 1.批量删除存储过程 declare @procNa ...

  9. Postgresql两表联结更新

    Postgresql两表联合更新近日使用Postgresql感到有点不好用,一个联合更新非要这样写语法才对:update d_routetripset name=b.name ,    descrip ...

随机推荐

  1. [网站公告]11月26日00:00-04:00阿里云RDS升级

    大家好,11月26号00:00-04:00(今天夜里),阿里云将对我们所用的SQL Server RDS实例所在的物理主机做升级操作(目前博客园整站运行于阿里云上),升级期间RDS实例会有2次闪断,每 ...

  2. Codeforces 1139D(期望dp)

    题意是模拟一个循环,一开始有一个空序列,之后每次循环: 1.从1到m中随机选出一个数字添加进去,每个数字被选的概率相同. 2.检查这个序列的gcd是否为1,如果为1则停止,若否则重复1操作直至gcd为 ...

  3. Mysql Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

    Mysql update error: Error Code: 1175. You are using safe update mode and you tried to update a table ...

  4. [oldboy-django][2深入django]学生管理(Form)-- 编辑(设置input标签属性,设置input标签默认显示值,设置input的类型)

    1 django 后台实现设置input标签属性,设置input标签默认显示值,设置input输入框类型 # Form生成html标签 a. 通过Form生成Input输入框,Form标签,以及sub ...

  5. jquery的html、text、val的用法

    .html()用为读取和修改元素的HTML标签 .text()用来读取或修改元素的纯文本内容 .val()用来读取或修改表单元素的value值. 这三个方法功能上的对比 .html(),.text() ...

  6. 一些echarts的基本图形

    先拿一个图形渲染过程举例 引用处 <bar ref="ARPUChart" v-if="ARPUChart" style="width:500p ...

  7. [nowcoder_Wannafly挑战赛4_F]线路规划

    [nowcoder_Wannafly挑战赛4_F]线路规划 试题描述 Q国的监察院是一个神秘的组织. 这个组织掌握了整个帝国的地下力量,监察着Q国的每一个人. 监察院一共有 \(N\) 个成员,每一个 ...

  8. react输入框输入中文bug

    一般来说,react上我们都会用change事件去处理input的输入,但这样就导致一个问题,在输入中文的时候,我们还没输入完成就会触发change事件,这样显然不是理想状况. 那么,怎么解决这个问题 ...

  9. Python 操作 Mysql 模块

    一.Python 操作 Mysql 模块的安装 linux: yum install MySQL-python window: http://files.cnblogs.com/files/wupei ...

  10. Linux下对superblock的理解

    对superblock的理解首先从partition structure的结构开始: 开始的,总的来说,block这个概念好理解..下面就是对super block的理解了Super block即为超 ...