[MS Sql Server 2000/2005] Fehler in Stored Procedure werden übergangen



  • Ich führe in einer Stored Procedure ein Select aus, welches Datensätze liefert, die dann im Hochsprachenprogramm (C#) verarbeitet werden.

    Tritt in der Sql-Abfrage ein Fehler auf, wird die Abfrage beendet, aber keine Exception ausgelöst. Für das Hochsprachenprogramm sieht es aus, als ob keine Datensätze gefunden worden wären, von einem Fehler ist nichts zu bemerken. Es wird nur eine leere Ergebnismenge zurückgegeben.

    Beispiel, das zu einem Fehler ohne Meldung führt:
    Die Abfrage hat eine Unterabfrage, die nur einen einzigen Datensatz liefern darf. Werden mehrere gefunden, führt das zu einem Fehler.

    Beispiel:

    CREATE PROCEDURE testschema.Test
    AS
    BEGIN
    
    SELECT *
    FROM a
    WHERE wert = (SELECT wert2 FROM b WHERE c = 2)
    
    /* Dieser Code wird nicht mehr erreicht, auch im Erfolgsfall: */
    
    IF @@ERROR <> 0 BEGIN
    ...
    END
    
    END
    

    Was kann ich tuen, damit das Hochsprachenprogramm erfährt, dass ein Fehler aufgetreten ist?
    Ich habe leider (noch) keine Möglichkeit gefunden einzustellen, dass jeder Fehler (egal welcher Schweregrad) zu einer Exception im Hochsprachenprogramm führt.

    Wäre für Tipps sehr dankbar.



  • Hi,

    du fängst doch in der Prozedur mit

    IF @@ERROR <> 0 BEGIN
    ...
    END
    

    den Fehler ab.
    Mach das raus und es kracht falls die Abfrage schief geht.
    Dadurch bekommt das C# Programm den Fehler nicht mit.
    Ich würds immer so machen, dass die Prozedur nen Fehler wirft falls was nicht stimmt und den dann im Programm behandeln.



  • Maxba schrieb:

    Hi,

    du fängst doch in der Prozedur mit

    IF @@ERROR <> 0 BEGIN
    ...
    END
    

    den Fehler ab.
    Mach das raus und es kracht falls die Abfrage schief geht.
    Dadurch bekommt das C# Programm den Fehler nicht mit.
    Ich würds immer so machen, dass die Prozedur nen Fehler wirft falls was nicht stimmt und den dann im Programm behandeln.

    Leider nicht. Den "@@ERROR"-Check habe ich nur testweise reingenommen. Auch ohne hat es keine Exception gegeben.



  • Hm sehr seltsam,

    wie wäre es so:

    CREATE PROCEDURE testschema.Test
    AS
    BEGIN
    
    declare @count int
    set @count = 0
    SELECT @count = count(wert2) from b where c = 2
    
    IF (@count > 1)
       RAISERROR ('Fehler',16,1)
    ELSE
      SELECT *
      FROM a
      WHERE wert = (SELECT wert2 FROM b WHERE c = 2)
    
    END
    

    Vielleicht geht ja das?



  • Hallo Maxba,

    ich habe das nun anders gelöst. Aus dem C#-Programm rufe ich, unmittelbar nach Ausführung der Procedure, den Wert der @@Error-Variabel ab. Das klappt dann so wie erwüscht.

    Gruß


Anmelden zum Antworten