Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL connection Fehler abfangen (https://www.delphipraxis.net/196660-sql-connection-fehler-abfangen.html)

Pet04 7. Jun 2018 08:31

Datenbank: MSSQL • Version: 2008R2 • Zugriff über: Ado

SQL connection Fehler abfangen
 
Hallo,

ich habe folgendes Problem.
Ich möchte meine Datenbankverbindung anpassen und ein Dialog (ÄHNLICH wie UDL Datei) für den Bunutzer anzeigen lassen wenn die Datenbankverbindung fehl schlägt.

Ist zB. der DB-Name falsch kommt eine Fehlermeldung von Windows/SQLServer und das finally wird nicht mehr ausgeführt.

Benutze MSSQLServer 2008R2 Express



Delphi-Quellcode:
 // Verbindungsaufbau zum SQL Server
  ADOC_ChristDB.Connected := false;
  ADOC_ChristDB.ConnectionString := SQL_Server;
    try
    ADOC_ChristDB.open;
  finally
    if ADOC_ChristDB.Connected = false then
    begin
      ADOC_ChristDB.close;
      OpenSQLServerForm := TOpenSQLServerForm.Create(Application); // 
      OpenSQLServerForm.ShowModal;    
      //Application.Terminate;
    end;
  end;
Danke für eure Hilfe

Grüße Pet

timog 7. Jun 2018 08:38

AW: SQL connection Fehler abfangen
 
Was passiert, wenn Du das try eine Zeile nach oben schiebst? Wäre ein except auf bestimmte Fehler hier nicht besser?

Jasocul 7. Jun 2018 08:44

AW: SQL connection Fehler abfangen
 
Zunächst mal müsstest du das open nach dem try machen. Da das open den Fehler verursacht, aber bei dir nicht im Schutzblock steht, kann das Finally nicht greifen.

Außerdem:
Nicht
Delphi-Quellcode:
if ADOC_ChristDB.Connected = false then
sondern
Delphi-Quellcode:
if not ADOC_ChristDB.Connected then
Das wurde im Forum schon so oft besprochen, dass ich es hier nicht nochmal erkläre.

Pet04 7. Jun 2018 09:03

AW: SQL connection Fehler abfangen
 
Sorry try ist verrutscht und ist vor open.
Mit except tritt das gleiche Problem auf.

Mit "IF not" ändert sich auch nichts.

Wenn ich einen Haltepunkt bei " ADOC_ChristDB.open;" setze und debugge funktioniert es.

Jasocul 7. Jun 2018 09:20

AW: SQL connection Fehler abfangen
 
Zitat:

Zitat von Pet04 (Beitrag 1404135)
Mit "IF not" ändert sich auch nichts.

Das war generell gemeint und nicht auf das aktuelle Problem bezogen. Ein Vergleich auf True oder False kann in seltenen Fällen zu unerwarteten Fehlern führen.

Zum Thema:
Wenn die Connection fehlgeschlagen ist, also Connected auf False steht, solltest du kein Close der Connection mehr machen. Eventuell (kann ich hier nicht testen) führt das zu einer weiteren Exception. Dadurch würde der Rest im Finally-Block nicht mehr ausgeführt. Warum es dann beim Debuggen trotzdem durchlaufen wird, kann ich dir so nicht sagen.

Pet04 7. Jun 2018 10:49

AW: SQL connection Fehler abfangen
 
Leider hat das mit der "ADOC_ChristDB.close;" auch nichts gebracht.

HolgerX 7. Jun 2018 11:04

AW: SQL connection Fehler abfangen
 
Hmm..

Hast Du dass mal mit einer Fehlerausgabe getest?
Nach folgendem Schema?

Delphi-Quellcode:
  ADOC_ChristDB.CLose;
  ADOC_ChristDB.ConnectionString := SQL_Server;
  try
    ADOC_ChristDB.Open;
  except
    // OLE-Exception von MS/ADO
    on e: EOLEException do begin
      // Zum Testen!!
      ShowMessage('[' + E.ClassName + '] ' + IntToHEX(E.ErrorCode,8) + ' ' + E.Source + #13#10 + E.Message);
      // Hier könnte auf den spezifischen ErrorCode von Microsoft reagiert werden!!!

      //OpenSQLServerForm := TOpenSQLServerForm.Create(Application); //
      //OpenSQLServerForm.ShowModal;
    end;
    // Andere Exception
    on e: Exception do begin
      ShowMessage(E.Message);
    end;
  end;
(Aus dem Kopf herunter getippt...)

Pet04 7. Jun 2018 14:19

AW: SQL connection Fehler abfangen
 
Problem besteht immer noch. Auf mit OLEExeption.

Jasocul 7. Jun 2018 14:33

AW: SQL connection Fehler abfangen
 
Ich habe den Verdacht, dass du an der falschen Stelle suchst.
Mache mal zwischen jedem schritt ein ShowMessage, damit du siehst, wie weit dein Programm kommt.
Meine Vermutung ist, dass der Fehler im TOpenSQLServerForm.Create(Application) entsteht. Aber das ist nur Spekulation.

HolgerX 7. Jun 2018 14:58

AW: SQL connection Fehler abfangen
 
Hmm..

Zitat:

Zitat von Pet04 (Beitrag 1404182)
Problem besteht immer noch. Auf mit OLEExeption.

Hast Du meinen Source mit dem ShowMessage verwendet (Auskommentierter Dialog)?

Wenn ja, was wird den als Fehler angezeigt?

Pet04 8. Jun 2018 09:49

AW: SQL connection Fehler abfangen
 
es kommt die Fehlermeldung
"Cannot open database "dbname" requested by Login. The Login failed"

diese Meldung kommt wohl von open und das except wird wohl nicht mehr ausgeführt.

HolgerX 8. Jun 2018 10:32

AW: SQL connection Fehler abfangen
 
Hmm..

Zitat:

Zitat von Pet04 (Beitrag 1404232)
es kommt die Fehlermeldung
"Cannot open database "dbname" requested by Login. The Login failed"

diese Meldung kommt wohl von open und das except wird wohl nicht mehr ausgeführt.

Dass das Open den Fehler schmeißt ist Richtig, wenn jedoch die Exeption nicht vom Ty.. except gepackt wird, dann ist hier wohl was anderes nicht OK...

Wenn Du mein Muster-Src verwendet hast, sollte zum einen im Debugger (beim Open) die Fehlermeldung kommen und anschließend von der Exception ein ShowMessage.

Bei OLE-Fehlern (und hierzu gehört dein Fehler) sollte auch der FehlerCode kommen, bei allen anderen nur der Text.

Deshalb: Welcher Text wird wann angezeigt, mit oder ohne OLE-Fehlercode?

Pet04 14. Jun 2018 13:40

AW: SQL connection Fehler abfangen
 
Es kommt nur die Exception von open.

Beim debuggen springt er gar nicht in die Exeptions rein.

jobo 14. Jun 2018 15:51

AW: SQL connection Fehler abfangen
 
Gibt es nicht dieses Problem, wenn eine VCL Komponente (connection) in der IDE bereits geöffnet ist und dann beim Start / Formcreate sofort erneut diesen Zustand herstellen will?
(Ich bekomm es nicht mehr richtig zusammen, die in der IDE geöffnete Connection muss ja auch irgendwie richtig konfiguriert sein, sonst wäre sie nicht offen)

Pet04 14. Jun 2018 16:00

AW: SQL connection Fehler abfangen
 
So habe das Problem gefunden und gelöst.

Im OI stand die Eigenschaft "ConnectOption" auf "coAsyncConnect" :-D


Grüße Pet


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 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 by Thomas Breitkreuz