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;                                  
 
 

 Verein
Verein 
 Links
Links Suche
Suche