• TStream实现多表提交


    TStream实现多表提交

    function TynFiredac.SaveDatas(const ATableName, ATableName2: string; ADeltas: TStream; AStorageFormat: string = 'binary'): string;
    var
      LStream1, LStream2: TStream;
    begin
      Result := 'false';
      if (ATableName = '') or (ADeltas = nil) or (ATableName2 = '') then
        Exit;
    
      LStream1 := TMemoryStream.Create;
      LStream2 := TMemoryStream.Create;
      TynStream.SplitStream(ADeltas, LStream1, LStream2);
      LStream1.Position := 0;
      LStream2.Position := 0;
      try
        try
          if not FDConnection1.InTransaction then
            FDConnection1.StartTransaction; // 开启事务
          FDQuery1.Close;                   // 保存表一
          FDQuery1.sql.Clear;
          FDQuery1.CachedUpdates := True;
          FDQuery1.UpdateOptions.UpdateTableName := ATableName;
          FDQuery1.sql.Text := 'select * from ' + ATableName + ' where 1=2';
          FDQuery1.LoadFromStream(LStream1, TynStream.GetFDStorageFormat(AStorageFormat));
          if FDQuery1.ApplyUpdates = 0 then
          begin
            Result := 'true';
          end
          else
          begin
            Result := 'false';
            FDConnection1.Rollback; // 回滚事务
            Exit;                   // 保存表一发生错误,表二就不用再提交
          end;
    
          FDQuery1.Close;                // 保存表二
          FDQuery1.sql.Clear;
          FDQuery1.CachedUpdates := True;
          FDQuery1.UpdateOptions.UpdateTableName := ATableName2;
          FDQuery1.sql.Text := 'select * from ' + ATableName2 + ' where 1=2';
          FDQuery1.LoadFromStream(LStream2, TynStream.GetFDStorageFormat(AStorageFormat));
          if FDQuery1.ApplyUpdates = 0 then
          begin
            Result := 'true';
            FDConnection1.Commit;  // 提交事务
          end
          else
          begin
            Result := 'false';
            FDConnection1.Rollback; // 回滚事务
          end;
        except
          on E: Exception do
          begin
            Result := 'false';
            FDConnection1.Rollback; // 回滚事务
            Log.WriteLog('TynFiredac.SaveDatas ' + E.Message);
          end;
        end;
      finally
        LStream1.Free;
        LStream2.Free;
        FDQuery1.Close;
        FDConnection1.Close;
      end;
    end;
    

      

  • 相关阅读:
    注册“Oracle Provider for OLE DB”和创建链接服务器
    前端编辑神器Brackets
    vue+webpack项目实战
    MPreview.js
    webpack+gulp实现自动构建部署
    rem布局下使用背景图片和sprite图
    webpack配合vue.js实现完整的单页面demo
    淘宝弹性布局方案lib-flexible研究
    前端工程化
    mock server相关解决方案
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/9947656.html
Copyright © 2020-2023  润新知