DataSnap开发:利用TParams进行多表事务更新
来源:互联网 发布:龙华行知实验小学排名 编辑:程序博客网 时间:2024/05/20 17:24
网上看到的主从表更新多是传递Olevariant进行更新,其实可以直接利用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进行多表事务更新
- DataSnap开发:利用TParams进行多表事务更新
- DataSnap——利用TParams进行多表事务更新
- 利用DataSnap进行数据流(TStream)的传递
- 利用游标循环进行更新插入的SQL事务语句
- 利用游标循环进行更新插入的SQL事务语句
- 利用跨表更新进行数据恢复
- 利用yum进行系统更新
- 开发DataSnap服务器
- 利用双向循环链表进行显示更新
- oracle触发器中对同一张表进行更新再查询时,需加自制事务
- ORACLE 触发器对同一张表进行更新再查询时,需加自制事务
- 【Lua】如何利用lua进行热更新
- iOS 利用 framework 进行动态更新
- iOS 利用 framework 进行动态更新
- Qt利用线程进行数据更新
- DataSnap
- DELPHI DATASNAP 入门操作(3)简单的主从表的简单更新【含简单事务处理】
- 利用RMi进行分布式开发
- 图形框架协议 Wayland
- latex公式中的空格如何表示?
- extern 的用法
- HDOJ 1001 Sum Problem
- 仅以此纪念一个正要走上“程序员”道路的“金融”从业者
- DataSnap开发:利用TParams进行多表事务更新
- java用补码表示负数
- Tomcat Server.xml详解
- NYOJ 788 又见Alice and Bob
- PHP-图形图像-GD2-配置
- 保时捷917/7代911实拍回顾
- 怎么编译apue的程序
- 线程的生命周期
- hdu4770Lights Against Dudely