TStream实现多表提交

TStream实现多表提交

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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;

  

posted @   delphi中间件  阅读(891)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示