[fpc-pascal] SqlDB TSQLQuery sqoAutoApplyUpdates does not work with ExecSQL

Andreas Frieß friess at gmx.at
Thu Dec 15 10:05:41 CET 2022


On MSSQL i use a stroed procedure to count a value in a table and use
the following statement in Lazarus

> 1.
>     procedureTForm1.BuExecuteClick(Sender:TObject);
> 2.
>     var
> 3.
>       SQL:string;
> 4.
>     begin
> 5.
>       Memo1.Clear;
> 6.
>       SQL:='';
> 7.
>       SQL:='EXECUTE [dbo].[GetNextZaehler] :TagNr,:ProduktNr ';
> 8.
>       Query.Active:=false;
> 9.
>       Query.Clear;
>10.
>       Query.SQL.Text:=SQL;
>11.
>       Query.ParamByName('TagNr').AsInteger:=10;
>12.
>       Query.ParamByName('ProduktNr').AsInteger:=100;
>13.
>       Query.Options:=[sqoAutoApplyUpdates,sqoAutoCommit];// <--
>     AutoApplyUpdates doesnt work !?
>14.
>     try
>15.
>         Query.Open;
>16.
>     ifnot(Query.EOFandQuery.BOF)thenbegin
>17.
>          
>     Memo1.Append('Wert='+Query.FieldByName('StueckZaehler').AsInteger.ToString);
>18.
>     end
>19.
>     elsebegin
>20.
>           Memo1.Append('Kein Wert');
>21.
>     end;
>22.
>     //Query.ApplyUpdates; // <-- If i use this it works
>23.
>         Query.Close;
>24.
>     except
>25.
>         on E:Exceptiondobegin
>26.
>           Memo1.Append('BuExecuteClick Exception =>'+E.Message);
>27.
>     end;
>28.
>     end;
>29.
>     end;
>30.
>
I must extra write an ApplyUpdates, because the sqoAutoApplyUpdates  is
ignored by the ExecSQL of the query.

in sqldb.pp the following code is executed

> procedure TCustomSQLQuery.ExecSQL;
>
> begin
>   CheckPrepare;
>   try
>     Execute;
>     // Always retrieve rows affected
>     FStatement.RowsAffected;
>     If sqoAutoCommit in Options then
>       SQLTransaction.Commit;
>   finally
>     CheckUnPrepare;
>     // if not Prepared and (assigned(Database)) and (assigned(Cursor))
> then SQLConnection.UnPrepareStatement(Cursor);
>   end;
> end;
I see the autocommit is configured, but  sqoAutoApplyUpdates is missing.
It hink it should be

> procedure TCustomSQLQuery.ExecSQL;
>
> begin
>   CheckPrepare;
>   try
>     Execute;
>     // Always retrieve rows affected
>     FStatement.RowsAffected;
>     If sqoAutoCommit in Options then
>       SQLTransaction.Commit;
>     If (sqoAutoApplyUpdates in Options) then
>       ApplyUpdates;
>   finally
>     CheckUnPrepare;
>     // if not Prepared and (assigned(Database)) and (assigned(Cursor))
> then SQLConnection.UnPrepareStatement(Cursor);
>   end;
> end;
to get the correct behavior. Actual only Post and Delete fire the
ApplyUpdates correct if sqoAutoApplyUpdates is activated. Should i file
a Bug or is the actual behavior by design ?! (and cannot be changed)

Andreas

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20221215/6785ba73/attachment.htm>


More information about the fpc-pascal mailing list