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'