• 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;
    

      

  • 相关阅读:
    window多线程编程
    强大的字符数组
    linux设置环境变量一些坑的总结
    Java hello world
    一次音频波形的问题
    0xfffxxx的负数表示
    pcm数据格式存储格式
    Pooled genome sequence strategies |representative genome assembly approaches|Domestication|GERP|selective sweep|Hybridization|Introgression|iHS|SNP genotyping arrays|haplotype
    【转】Fst指数
    index|substr
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/9947656.html
Copyright © 2020-2023  润新知