mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-22 19:29:24 +02:00
fcl-db: sqldb: when applying updates to modified record, look for parameter ":field_name" in InsertSQL,UpdateSQL,DeleteSQL first in TFields and if not found then in TParams. Bug #31411
git-svn-id: trunk@35486 -
This commit is contained in:
parent
ffd6465563
commit
689fa805eb
@ -1964,7 +1964,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TSQLConnection.ApplyFieldUpdate(C : TSQLCursor; P : TSQLDBParam;F : TField; UseOldValue : Boolean);
|
||||
procedure TSQLConnection.ApplyFieldUpdate(C : TSQLCursor; P : TSQLDBParam; F : TField; UseOldValue : Boolean);
|
||||
|
||||
begin
|
||||
if UseOldValue then
|
||||
@ -1981,36 +1981,36 @@ var
|
||||
s : string;
|
||||
x : integer;
|
||||
Fld : TField;
|
||||
P : TParam;
|
||||
B,ReturningClause : Boolean;
|
||||
Par, P : TParam;
|
||||
UseOldValue, HasReturningClause : Boolean;
|
||||
|
||||
begin
|
||||
qry:=Nil;
|
||||
ReturningClause:=(sqSupportReturning in ConnOptions) and not (sqoRefreshUsingSelect in Query.Options) and (Trim(Query.RefreshSQL.Text)='');
|
||||
HasReturningClause:=(sqSupportReturning in ConnOptions) and not (sqoRefreshUsingSelect in Query.Options) and (Trim(Query.RefreshSQL.Text)='');
|
||||
case UpdateKind of
|
||||
ukInsert : begin
|
||||
s := Trim(Query.FInsertSQL.Text);
|
||||
if s = '' then
|
||||
s := ConstructInsertSQL(Query, ReturningClause)
|
||||
s := ConstructInsertSQL(Query, HasReturningClause)
|
||||
else
|
||||
ReturningClause := False;
|
||||
HasReturningClause := False;
|
||||
qry := InitialiseUpdateStatement(Query, Query.FInsertQry);
|
||||
end;
|
||||
ukModify : begin
|
||||
s := Trim(Query.FUpdateSQL.Text);
|
||||
if s = '' then begin
|
||||
//if not assigned(Query.FUpdateQry) or (Query.UpdateMode<>upWhereKeyOnly) then // first time or dynamic where part
|
||||
s := ConstructUpdateSQL(Query, ReturningClause);
|
||||
s := ConstructUpdateSQL(Query, HasReturningClause);
|
||||
end
|
||||
else
|
||||
ReturningClause := False;
|
||||
HasReturningClause := False;
|
||||
qry := InitialiseUpdateStatement(Query, Query.FUpdateQry);
|
||||
end;
|
||||
ukDelete : begin
|
||||
s := Trim(Query.FDeleteSQL.Text);
|
||||
if (s='') and (not assigned(Query.FDeleteQry) or (Query.UpdateMode<>upWhereKeyOnly)) then
|
||||
s := ConstructDeleteSQL(Query);
|
||||
ReturningClause := False;
|
||||
HasReturningClause := False;
|
||||
qry := InitialiseUpdateStatement(Query, Query.FDeleteQry);
|
||||
end;
|
||||
end;
|
||||
@ -2020,14 +2020,28 @@ begin
|
||||
for x:=0 to Qry.Params.Count-1 do
|
||||
begin
|
||||
P:=Qry.Params[x];
|
||||
S:=p.name;
|
||||
B:=SameText(leftstr(S,4),'OLD_');
|
||||
if B then
|
||||
S:=P.Name;
|
||||
UseOldValue:=SameText(Copy(S,1,4),'OLD_');
|
||||
if UseOldValue then
|
||||
begin
|
||||
Delete(S,1,4);
|
||||
Fld:=Query.FieldByName(S);
|
||||
ApplyFieldUpdate(Query.Cursor,P as TSQLDBParam,Fld,B);
|
||||
Fld:=Query.FieldByName(S);
|
||||
end
|
||||
else
|
||||
Fld:=Query.FindField(S);
|
||||
if Assigned(Fld) then
|
||||
ApplyFieldUpdate(Query.Cursor, P as TSQLDBParam, Fld, UseOldValue)
|
||||
else
|
||||
begin
|
||||
// if does not exists field with given name, try look for param
|
||||
Par:=Query.Params.FindParam(S);
|
||||
if Assigned(Par) then
|
||||
P.Assign(Par)
|
||||
else
|
||||
DatabaseErrorFmt(SFieldNotFound,[S],Query); // same error as raised by FieldByName()
|
||||
end;
|
||||
end;
|
||||
if ReturningClause then
|
||||
if HasReturningClause then
|
||||
begin
|
||||
Qry.Close;
|
||||
Qry.Open
|
||||
@ -2039,7 +2053,7 @@ begin
|
||||
Qry.Close;
|
||||
DatabaseErrorFmt(SErrFailedToUpdateRecord, [Qry.RowsAffected], Query);
|
||||
end;
|
||||
if ReturningClause then
|
||||
if HasReturningClause then
|
||||
Query.ApplyReturningResult(Qry,UpdateKind);
|
||||
end;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user