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;