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;