TStream實現多表提交
阿新 • • 發佈:2018-11-12
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;