Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Fehlerbehandlung von Stored Procedures (https://www.delphipraxis.net/103466-fehlerbehandlung-von-stored-procedures.html)

alzaimar 16. Nov 2007 07:57

Datenbank: MSSQL • Version: 2000 • Zugriff über: ADO

Fehlerbehandlung von Stored Procedures
 
Hi

Kleines Problem, wenig Zeit (deshalb müsst ihr ran :mrgreen: )

Ich habe auf dem Papier eine Stored Procedure, die wird über ADO irgendwie aufgerufen. Diese SP übermittelt Daten an einen anderen Server (mit INSERT). Nun kann es sein, das der andere Server nicht erreichbar ist. Dann soll die SP die Daten lokal zwischenspeichern.

Die Tatsache, ob das der Server nicht erreichbar ist, ermittle ich einfach über die @@Error-Variable (wenn's knallt, dann lokal zwischenspeichern). Das sollte auch funktionieren.

Ich will nun aber nicht, das dieser (und nur dieser!) Fehler an ADO zurückgemeldet wird.

Frage: Kann man die Generierung der Fehlermeldung auf SQL-Seite ausschalten, sodaß ADO davon nix mitbekommt, also so ne Art 'Try...Except End', oder 'ON ERROR CONTINUE'?

Die Alternative wäre, die Daten immer zwischenzuspeichern, und dann über einen separaten Task (z.B. jede Minute) die lokalen Daten zu übermitteln, der Kunde würde aber lieber die direkte Übermittlung sehen (ja ja, wenn die Kunden nicht wären).

alzaimar 19. Nov 2007 06:29

Re: Fehlerbehandlung von Stored Procedures
 
Muss untergegangen sein (push).

Hat Jemand eine Idee?

PaulJr 19. Nov 2007 08:08

Re: Fehlerbehandlung von Stored Procedures
 
Hallo Alzamir, :???:

ich bezweifle, dass Du die (SQL) Fehlermeldung so einfach unterdrücken kannst.

Ich benutze ADO nicht aber die Mechanismen sollten überall die Gleichen sein: Darum, ich z.B. erkenne nicht nur solche Fehler in entsprechenden Ereignissen sondern (um diese zu unterdrücken) behandle diese auch…

Viele Grüße
PaulJr

alzaimar 19. Nov 2007 08:39

Re: Fehlerbehandlung von Stored Procedures
 
Hau Paul,

ich bezweifle das auch, bin aber nicht allwissend. Ich habe gehofft, irgendeine obskure 'SET ERROR OFF' - Einstellung würde MSSQL das Maul stopfen. Ich befürchte, ich muss die Mittelschicht anfassen, was tödlich sein kann ('Never touch a running system').

Nun denn, Suizid als Hobby. Auch was neues.

Phoenix 19. Nov 2007 08:41

Re: Fehlerbehandlung von Stored Procedures
 
Strukturierte Fehlerbehandluung kennt der SQL Server 2000 nicht. Sorry. Das geht erst ab SQL Server 2005.

Elvis 19. Nov 2007 08:45

Re: Fehlerbehandlung von Stored Procedures
 
Würde es nicht mehr Sinn machen, das Ganze in einer nativen XProc zu lösen?
TSQL ist doch für alles jenseits einem SELECT und einer if-Clause viel zu drecks-eklig.
Gerade die Fehlerbehandlung wird keiner außer dir kapieren können...

Jelly 19. Nov 2007 08:48

Re: Fehlerbehandlung von Stored Procedures
 
Du kannst, wie du ja schon machst, über @@error den Fehler abfragen. Speichere den Wert in einer Zwischenvariablen und prüfe anschliessend über

SQL-Code:
if @myError <> 0 BEGIN
   goto ErrorHandler
END

-- Hier der normale Ablauf
Goto ExitProc

ErrorHandler:
Rollback Tran
return


ExitProc:
return
deinen Fehler.
Laut meinem Buch wird beim Fehler zum Label ErrorHandler gesprungen. Dort kannst du auf jeden Fall noch ein paar Aktionen durchführen. Ob der Return allerdings nun dennoch einen Fehler auf Clientseite auslöst, weiss ich nicht.

Hast du vielleicht eine Möglichkeit einen SQL Server der Version 2005 zu nutzen. Dort gibts ein neues Errorhandling über Try...catch Blöcke wie man sie von anderen Programmiersprachen her kennt. Da wird auf jeden Fall die Fehlermeldung beim Client unterbunden. Soll sie dennoch ausgelöst werden, reicht ein erneuter Raiserror im Catch-Block.

Jelly 19. Nov 2007 08:49

Re: Fehlerbehandlung von Stored Procedures
 
Zitat:

Zitat von Elvis
Gerade die Fehlerbehandlung wird keiner außer dir kapieren können...

Robert, du weisst aber schon dann man auch eigene Fehlermeldungen definieren kann... Sogar parametrisiert.

alzaimar 19. Nov 2007 08:52

Re: Fehlerbehandlung von Stored Procedures
 
Ich arbeite ausgiebig mit eigenen benutzerdefinierten Fehlermeldungen, das funktioniert wunderbar. Ich war/bin auf Version 2000 eingeschossen, sodaß der Hinweis auf den TRY-CATCH-Block der 2005er die Lösung meines Problemes darstellen könnte.

Ich glaub sogar, das Zielsystem ist ein 2005er, nur die Testumgebung (noch) eine alte Gurke.


Danke für den Hinweis!

Jelly 19. Nov 2007 08:54

Re: Fehlerbehandlung von Stored Procedures
 
Dann haste ja noch mal die letzte Ausfahrt erwischt :mrgreen:

Leuselator 28. Nov 2007 10:14

Re: Fehlerbehandlung von Stored Procedures
 
egal ob 2000 oder 2005, wenn es eine SP ist, solltest Du doch in der SP schon behandeln können und das Ergebnis über Outputparameter zurükliefern können a la:
SQL-Code:
CREATE PROCEDURE MachEsRemoteOderLokal
( @DoneRemote bit output
)
AS
BEGIN
  SET @DoneRemote = 1
  INSERT INTO RemoteServer.RemoteDB.RemoteUser.RemoteTable

  IF @@ERROR <> 0 BEGIN
    INSERT INTO LocalDb.LocalUser.LocalTable
    SET @DoneRemote = 0
  END
END
Sinngemäß
Delphi-Quellcode:
  AdoProcedure.Execute;
  if AdoProcedure.Parameters.ParamByName('@DoneRemote').AsBoolean
    then 'Remote'
    else 'Lokal';
Gruß

alzaimar 28. Nov 2007 10:15

Re: Fehlerbehandlung von Stored Procedures
 
Ja ja, nur wird der Fehler in der DB an die ADOConnection zurückgemeldet. Und die löst dann ggf. eine Exception aus. Und DAS will ich nicht.

Leuselator 28. Nov 2007 10:30

Re: Fehlerbehandlung von Stored Procedures
 
dann setz vor das letzte "END" noch ein " RETURN 0" sollte dann keinen Fehler mehr geben...
Gruß

Jelly 28. Nov 2007 15:37

Re: Fehlerbehandlung von Stored Procedures
 
In 2000 wird ein Fehler, meines Wissens, am Client eine Exception auslösen. Ich glaube nicht, dass man den in der Stored Procedure übergehen kann.

In 2005 ist das mit den Try-Catch Block jedoch möglich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:53 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