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. 33、secret

    CemFjee9rueuoeeQhgkxCee9kee7nO+8jOW6lOeUqO+8jOaVsOaNruW6k+acjeWKoeeahOWFs+mUruS/oeaBr++8iOWmgiDmnI3l ...

  2. 【LoadRunner】场景执行报错“failed: WSA_IO_PENDING”

    问题:性能测试场景执行报“failed: WSA_IO_PENDING”错误 解决方法: 添加web_set_sockets_option("OVERLAPPED_SEND", & ...

  3. Memcached相关内容总结

    1.Memcached常用命令总结 Memcached命令格式一般为: command 其中描述如下: 参数 描述 command 操作命令,一般为set/add/replace/get/delete ...

  4. [oldboy-django][深入 rest framework] restframewok 教程: 分页功能

    http://www.django-rest-framework.org/api-guide/pagination/ https://stackoverflow.com/questions/31785 ...

  5. [python][django学习篇][2]创建django app

    推荐学校django博客:http://pythonzh.cn/post/8/ django app 可以理解为一个文件夹: 里面包含了相关功能的代码.通过manage.py来创建 web app 激 ...

  6. VC++中PostMessage、SendMessage和PeekMessage之间的区别

    1, PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数.而SendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息 ...

  7. 字符串匹配算法(在字符串T中查找是否有与字符串P相同的子串)

    T称为目标串(Target)或主串 ,P称为模式串(Pattren) 或子串 1. 简单字符串模式匹配算法 原理:用字符串P的字符依次与字符串T中的字符进行比较,首先将字符串P从第0个位置起与主串T的 ...

  8. AngularJs 特性 之 双向数据绑定

    <!DOCTYPE html> <html lang="en" ng-app> <head> <meta charset="UT ...

  9. Jmeter 设置HTTP RPS性能测试模型

    其实也挺简单的,主要是刚接触jmeter,记录一下. 1. 首先需要安装jmeter...真是废话... 2. 需要安装JMeterPlugins-ExtrasLibs-1.3.0.zip: JMet ...

  10. codechef May Challenge 2016 LADDU: Ladd 模拟

    All submissions for this problem are available. Read problems statements in Mandarin Chinese, Russia ...