AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken AnyDAC (FireDAC) - Exception beim schließen einer TADConnection
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Cashew · begonnen am 21. Mär 2018 · letzter Beitrag vom 7. Jun 2018
Antwort Antwort
Seite 2 von 2     12   
MichaelT

Registriert seit: 14. Sep 2005
Ort: 4020 Linz
562 Beiträge
 
Delphi 10.3 Rio
 
#1

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

  Alt 25. Mär 2018, 10:08
Original von der Antwort vom Dmitry.

At first it is too old FireDAC version …

This probably is not because BDE and FireDAC are used in the same application.

Many possible reasons:
* consequence of some incorrect multy-threading;
* incorrect use of FireDAC in a DLL;
* some FireDAC connection or query object is not released;
* some FireDAC incorrect usage leading to a bug in FireDAC.

---

Also irrte ich mich bezüglich BDE und FireDAC gemeinsam in einer Anwendung zu verwenden geht offensichtlich. Ist mal kein Schaden. An sich kann man das ausschließen was das Experiment mit dem neu sortieren der Statements schon zeigte.



Hallo zusammen,

wir sind gerade dabei unsere Delphi 7 Anwendung von der BDE Komponente auf die AnyDAC 8.0.5 (FireDAC) Komponente umzustellen...

Während der Umstellungsphase verwenden wir in unserer Anwendung beide Komponenten. Das heißt für die BDE Datenbankverbindung verwenden wir eine TDatabase und für die AnyDAC (FireDAC) Datenbankverbindung verwenden wird die TADConnection.

Im Event OnCloseQuery der Hauptform werden die Datenbankverbindungen geschlossen:

Code:
procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  [...]
  try
    BDEConnection.Connected := False;
  except
    on e:exception do
      MessageDlg('BDEConnection' + #13#10 + e.message, mtError, [mbOK], 0);
  end;
  //--------------------------------------------------------------------
  try
    dacConnection.Connected := False;
  except
    on e:exception do
      MessageDlg('dacConnection' + #13#10 + e.message, mtError, [mbOK], 0);
  end;
  [...]
end;
Beim schließen der AnyDAC (FireDAC) Datenbankverbindung erhalten wir die folgende Exception:
Zitat:
[FireDAC][Phys]-334. ADPhysManager shutdown timeout. Possible reason: application has not released all connection interfaces
IMHO sollten alle Queries, Tables, Transaktionen, etc. geschlossen sein...

Hat jemand schon mal diesen Fehler? Oder eine Idee woher der Fehler kommen könnte?

Edit: Die Exception erhalten wir nicht immer! Bisher konnten ich leider nicht nachvollziehen wann der Fehler auftritt!
  Mit Zitat antworten Zitat
Cashew

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

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

  Alt 17. Mai 2018, 15:41
Hallo zusammen...

seit heute beschäftige ich mich wieder mit der Exception, die ich beim Schließen der AnyDAC Connection erhalte.

Folgenden Vorschlag werd ich mir jetzt als Nächstes anschauen:

Am schnellsten geht es vermutlich wenn du dich in die

TFDPhysManager.InternalClose(ATerminate, AWaitForClose: Boolean); in der FireDAC.Phys reinhängst.


Folgendes habe ich heute noch versucht, leider ohne Erfolg:
  • Programm beenden ohne die TADConnection zu schließen
  • TADConnection schließen und auftretende Exceptions unterdrücken:
    Delphi-Quellcode:
       procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
       begin
         [...]
         try
           dacConnection.Connected := False;
         except
         end;
         [...]
       end;
What goes arround, comes arround
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 18. Mai 2018, 08:48
Hallo,
das bist doch du, oder ?
https://stackoverflow.com/questions/...ose-connection

Hast Du die Stelle mal debuggt
if TObject(FClients[I]) is TDataset
Du könntest auch den Code der kompletten Routine TCustomConnection.SendConnectEvent in Deinen eigenen Code packen
und mehr Log mitprotokollieren.

Wenn Du es nachstellen kannst, kommst du doch auch an den Namen des DataSets ran.

for I := 0 to FClients.Count - 1 do
Hier wäre doch ein Ansatz, alle DataSets zu durchlaufen und explizit zu schließen.


Ein ganz andere Ursache könnte auch ein Speicherfehler (Speicher überschrieben) sein,
der hier einfach Deine Connection vermurkst.
Nimm mal FastMM4 und prüfe, ob der Auffälligkeiten meldet.

Wenn es etwas Kosten darf, wäre auch PAL (Pascal Analyzer) interessant,
der findet viel mehr mögliche Probleme/Fehler als der Compiler.
Heiko
  Mit Zitat antworten Zitat
Cashew

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

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
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#5

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

  Alt 18. Mai 2018, 16:18
Hallo,
Zitat:
Nun stellt sich mir die Frage warum der CommandCount falsch ist, oder ein TADCustomCommand Objekt nicht mehr verfügbar ist.
Laß Dir doch von beiden irgendwas eindeutiges anzeigen, ich nehme meist Name oder ClassName.
Das passt hier ja wohl nicht.

Es könnte sein, dass Du irgendein Command-Objekt doppelt freigibst oder "falsch" freigibst.
Was auch immer "falsch" bedeutet.

Kannst Du das ganze Problem nicht mit einer separaten Beispiel-Exe nachvollziehen,
die nur minimalen Code enthält?
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz