![]() |
AW: AnyDAC (FireDAC) - Exception beim schließen einer TADConnection
@MichaelT
Vielen Dank für deine detailierten Infos... Aufgrund von anderen Problemen bin ich gestern leider nicht dazu gekommen das Thema weiter zu verfolgen... Wie bereits erwähnt habe ich in unseren Anwendung die folgenden Änderungen vorgenommen:
Ich werd mich jetzt dann mal ins InternalClose reinhängen wie von dir Empfohlen... @hoika Naja, gehört doch eigentlich dazu das man seine Connections schließt wenn man sie öffnet?! |
AW: AnyDAC (FireDAC) - Exception beim schließen einer TADConnection
Hallo,
ja, eigentlich schon;) Aber: Was passiert denn, wenn Du Dein Close/Free wegläßt, kommt dann immer noch die Exception? Prinzipell sollte man natürlich alles schließen, was man selbst geöffnet hat. Ich würde mal ein leeres Projekt mit ausschließlich dem BDE-Open/Connect FD-Open/Connect und dem Close/Free machen. Meistens ist es nämlich eine andere Stelle, die das Problem verursacht und nur zufällig im Close/Free den Fehler erzeugt, z.B. doppeltes Free oder irgend eine andere Speicherverletzung. Du solltest mal FastMM4 auf Dein Programm loslassen, um sowas zu prüfen. |
AW: AnyDAC (FireDAC) - Exception beim schließen einer TADConnection
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. Zitat:
|
AW: AnyDAC (FireDAC) - Exception beim schließen einer TADConnection
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: Zitat:
Folgendes habe ich heute noch versucht, leider ohne Erfolg:
|
AW: AnyDAC (FireDAC) - Exception beim schließen einer TADConnection
Hallo,
das bist doch du, oder ? ![]() 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. |
AW: AnyDAC (FireDAC) - Exception beim schließen einer TADConnection
Zitat:
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:
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.
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; 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' |
AW: AnyDAC (FireDAC) - Exception beim schließen einer TADConnection
Hallo,
Zitat:
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? |
AW: AnyDAC (FireDAC) - Exception beim schließen einer TADConnection
Der Fehler kommt nicht von der Stelle. Der kommt von früher. Das Disconnect tut nichts. Die Implementierung ist leer.
Aus irgendeinem Grund ist der Handle auf die DB Session ungültig, vermutlich auf der Serverseite. An sich genügt es, auch wenn es nicht sauber ist die Excpcetion zu bügeln bis die Migration vorbei ist und dann eine passende Client Library zu suchen oder möglw. zuvor. Es genügt ein isoliertes AnyDAC Beispiel um mal zu zeigen ob die Client Library an sich mal funktioniert. Hernach die BDE dazu tun. Irgendwann mal müsste sich das Phänomen zeigen. Es gab Fälle in den die die anderen Komponenten einfach sagten, 'Danke und schönen Tag liebe DB'. Ich kann mich noch an Fälle vor 8 erinnern als die großen Migrationswellen waren, da kam es hie und da vor, dass eine andere Library die Gegenseite. Das Timeout kann viel sein. In der C-DLL eine Absturz. Die kennen keine Exceptions. Ich vermute am Client tracen hilft. Nach Bauchgefühl wohlgemerkt halte ich das für wahrscheinlicher. Wie du sagst ohne den Code. Wenn das Programm zuvor lief könnte ich mir vorstellen, dass entweder die DB wurde abgegradet oder die Library getauscht oder eine andere wird geholt aus irgendeinem Grund. Zitat:
|
AW: AnyDAC (FireDAC) - Exception beim schließen einer TADConnection
Moin Moin...
Zitat:
Zitat:
Zitat:
Zitat:
|
AW: AnyDAC (FireDAC) - Exception beim schließen einer TADConnection
Gut. Danke für das Feedback. Dann muss ich für den Moment passen.
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:29 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