zoukankan      html  css  js  c++  java
  • 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, '订单表', ptInput);//有可能是主表
        aPar.AsBytes := ClientDataSet1.Delta;
      end;
    
      if ClientDataSet2.ChangeCount > 0 then
      begin
        aPar := aParams.CreateParam(ftVarBytes, '订单明细表', 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;
    

    转自:http://www.cnblogs.com/hnxxcxg/p/6897116.html

  • 相关阅读:
    【转载】CentOS 6.3(x86_64)下安装Oracle 10g R2 天高地厚
    Oracle查看表空间和删除表空间 天高地厚
    获取android手机的定位信息(转)
    android里pull解析xml文件
    google map 开发去掉图片阴影
    ubuntu12.04配置android开发环境遇到的问题
    google code中下载你的项目源码
    android无法自动生成R文件
    android中ocr解决方案(tesseract)
    自定义Android标题栏TitleBar布局(转)
  • 原文地址:https://www.cnblogs.com/xieyunc/p/9126478.html
Copyright © 2011-2022 走看看