Einzelnen Beitrag anzeigen

Cashew

Registriert seit: 15. Mär 2017
24 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#16

AW: AnyDAC (FireDAC) - Exception beim schließen einer TADConnection

  Alt 18. Mai 2018, 10:03
Jupp, ich habs gestern bei Stackoverflow mal mit reingestellt...


Die Methode <TCustomConnection>.SendConnectEvent versucht ja den Connect oder Disconnect an die über <TCustomConnection>.RegisterClient registrierten Clients weiterzugeben. Bei der Fehlersuche ist mir aufgefallen, dass die Klasse TADConnection über eine Methode ReleaseClients verfügt. Meine Idee war dann diese Methode vor dem Schließen der Datenbankverbindung aufzurufen:

Delphi-Quellcode:
   procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
   begin
     [...]
     dacConnection.ReleaseClients;
     //-----------------------------------------------------------------------
     try
       dacConnection.Connected := False;
     except
       on e:exception do
         MessageDlg('dacConnection' + #13#10 + e.message, mtError, [mbOK], 0);
     end;
     [...]
   end;

Dies hat nun den Effekt, das die Exception in der Methode ReleaseClients auftritt, und zwar an der folgenden Stelle:


Delphi-Quellcode:
procedure TADCustomConnection.ReleaseClients(AMode: TADReleaseClientMode = rmDisconnect);
var
  n, i: Integer;
  oDS: TADAdaptedDataSet;
begin
  [...]
  for i := CommandCount - 1 downto 0 do begin
    case AMode of
    rmFetchAll,
    rmClose:
      Commands[i].Close;
    rmOffline,
    rmDisconnect:
      begin
        n := CommandCount;
        Commands[i].Disconnect(True); // <-- Exception
        if n = CommandCount then
          DetachClient(Commands[i]);
      end;
    end;
  end;
end;
Das Problem an der Stelle ist, dass laut CommandCount zwei TADCustomCommand Objekte vorhanden sein sollten. Tatsächlich ist aber nur ein TADCustomCommand Objekt vorhanden. Nun stellt sich mir die Frage warum der CommandCount falsch ist, oder ein TADCustomCommand Objekt nicht mehr verfügbar ist.

Da wir ja die BDE und AnyDAC Komponenten parallel verwenden, und der <TDatabase>.DatabaseName beziehungsweise der <TADConnection>.ConnectionName identisch ist, werde ich als nächste mal testen ob das Problem gelöst ist, wenn ich unterschiedliche Namen verwende, zum Beispiel:

Code:
  BDEConnection.DatabaseName   := 'conBDE'
  dacConnection.ConnectionName := 'conDAC'
What goes arround, comes arround
  Mit Zitat antworten Zitat