안녕하세요. 현재 마이다스로 프로그램중인데 여러개의 테이블을 조작했을때 하나의 디비라도
문제가 되면 전체가 등록되지 않게 하려고 하는데 잘되지 않습니다.
서버에서는 조인된 몇개의 쿼리를 클라이언트에 뿌려주고 update는 아래와같이 updatesql을
사용하여 데이터 입출력을 합니다.
서버
query1,query2,query3
서버쪽은 아래 서버측 처럼 provider의 BeforeUpdateRecord를 이용하여 updatesql을 사용합니다.
하지만 query2에 문제가 발생하여 에러가 발생하면 query1은 이미 디비에 반영되어있거든요.
어찌하면 좋을까 갈켜주십시요.
2tier처럼 트랜잭션을 걸지도 못하고.......
질문이 좀복잡아네요. ...
클라이언트
try
query1.ApplyUpdates(-1);
query2.ApplyUpdates(-1);
query3.ApplyUpdates(-1);
StatusBar.Panels[0].Text:=' 저장이완료되었습니다.';
except
StatusBar.Panels[0].Text:=' 저장에러가 발생했습니다.';
end;
[서버측]
procedure TForm1.prvPgmBeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet; DeltaDS: TClientDataSet; UpdateKind: TUpdateKind;
var Applied: Boolean);
begin
upsPgm.DataSet:=datPgm;
SetUsQLParams(upspgm.Query[UpdateKind],DeltaDS);
upsPgm.ExecSql(UpDateKind);
Applied:=true;
end;
procedure TForm1.SetUSQLParams(AQuery: TQuery; ACDS: TClientDataset);
var
i: integer;
Old: Boolean;
Param: TParam;
PName: string;
Field: TField;
Value: Variant;
begin
with AQuery do
begin
for I := 0 to Params.Count - 1 do
begin
Param := Params[I];
PName := Param.Name;
Old := CompareText(Copy(PName, 1, 4), 'OLD_') = 0;
if Old then System.Delete(PName, 1, 4);
Field := ACDS.FindField(PName);
if not Assigned(Field) then Continue;
if Old then Param.AssignFieldValue(Field, Field.OldValue) else
begin
Value := Field.NewValue;
if VarIsEmpty(Value) then Value := Field.OldValue;
Param.AssignFieldValue(Field, Value);
end;
end;
end;
end;