ich glaube in der sqldb.pp einen Bug gefunden zu haben (der mir schon länger auf die Eier geht).
Ich habe in einem Projekt zwei SQLQuery. Mit der eine zeige ich Daten an und kann sie bearbeiten. Die Zweite benutze ich zum füllen der ersten.
zB so:
Code: Alles auswählen
SQLQuery1.Options:=[sqoKeepOpenOnCommit,sqoAutoApplyUpdates,sqoAutoCommit,sqoRefreshUsingSelect];
SQLQuery2.Close;
SQLQuery2.SQL.Clear;
SQLQuery2.SQL.Append('SELECT distinct CURRENCY FROM COUNTRY');
SQLQuery2.Open;
while not SQLQuery2.EOF do begin
SQLQuery1.AppendRecord([SQLQuery2.Fields[0].AsString, 'Yuan']);
SQLQuery2.Next;
end;
raus.Operation cannot be performed on an inactive dataset.
Ich denke der Fehler ist in der sqldb.pp (Lazarus Verion 3.99) Zeile 3273 : SQLTransaction.Commit;
Es sollte heißen: SQLTransaction.CommitRetaining;
Ich habe ein Beispiel Projekt angehängt.
Bevor ich einen Bugreport schreibe wäre es mir recht wenn ein erfahrener Entwickler drüber schauen könnte.
Ich habe das den Bug nur unter Linux, nur mit Firebird und nur Lazarus 2.2.6 und 3.99 getestet
Es geht um den Bereich in der sqldb.pp:
Code: Alles auswählen
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;
procedure TCustomSQLQuery.ApplyUpdates(MaxErrors: Integer);
begin
inherited ApplyUpdates(MaxErrors);
If sqoAutoCommit in Options then
begin
// Retrieve rows affected for last update.
FStatement.RowsAffected;
SQLTransaction.Commit;
end;
end;