TStream实现多表提交

本文介绍了一种使用TStream实现多表数据提交的方法,通过事务处理确保数据的一致性和完整性。具体步骤包括:创建内存流,使用TynStream.SplitStream拆分数据流,加载并保存到两个不同的表中,通过ApplyUpdates检查更新状态,最后提交或回滚事务。

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;

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值