SQL und Error handling

  • Hallo zusammen,
    ich habe ein kleines Script, mit dem ich Datensätze in eine MSSQL Datenbank schreiben will.
    Bevor ich einen Datensatz schreibe, prüfe ich mit einem übergebenen SQL Statement ab, ob der Datensatz bereits vorhanden ist. Idealerweise kommt ein leeres Suchergebnis zurück.

    Und da ist mein Problem: Zum Zweck des Errorhandlings für das Script habe ich eine Fehlerroutine eingebaut, die die Errors abfängt. Die Rückgabe eines leeren Suchergebnisses wird mit der Meldung belegt, dass (sinngemäss) kein Datensatz gefunden wurde, was ja soweit auch richtig ist. Diese Fehlermeldung stört aber ungemein und meine Frage ist: Wie kann ich die Function, die das Errorhandling steuert, zeitweise aus- und wieder anschalten?

    Viele Grüße,
    Duckbone

    Einmal editiert, zuletzt von Duckbone (20. Mai 2013 um 12:32) aus folgendem Grund: Problem wurde gelöst

  • Mit simpler Programmlogik? Du müsstest schon deinen Quellcode posten wenn man dir diesbezüglich behilflich sein soll. Wir wissen nicht wie du das Errorhandling letztlich realisiert hast.

  • Hier der entsprechende Code:

    [autoit]

    #Include <File.au3>
    #Include <Array.au3>
    #include <MSSQL.au3>
    #include <Excel.au3>

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc") ; --> error handling
    ; --> code Excel Datei zu Array einlesen
    ; ...
    ; ...
    $constrim="DRIVER={SQL Server};SERVER=servername;DATABASE=zdm;uid=sa;pwd=mypassword" ;--> anmelden an SQL Server usw.
    $adCN = ObjCreate ("ADODB.Connection")
    $adCN.Open ($constrim)
    $sQuery="use [zdm]"
    $result= $adCN.Execute($sQuery)
    $sQuery="Select id from zdm.td.devices where device_name like '" & $aArray [$i][3] & "'"
    $result= $adCN.Execute($sQuery)
    ; Wunsch: Hier Errorhandling ausschalten
    If $result.Fields( "id" ).Value = "" Then MsgBox(0,"","Datensatz nichtvorhanden, ok") ; --> hier kommt dann die Meldung vom Errorhandler
    ; Wunsch: Hier Errorhandling wieder aktivieren
    $adCN.Close
    Exit

    [/autoit][autoit][/autoit][autoit]

    Func MyErrFunc()
    Local $HexNumber
    $HexNumber = Hex($oMyError.number, 8)
    MsgBox(0, "COM Error Test", "We intercepted a COM Error !" & @CRLF & @CRLF & _
    "err.description is: " & @TAB & $oMyError.description & @CRLF & _
    "err.windescription:" & @TAB & $oMyError.windescription & @CRLF & _
    "err.number is: " & @TAB & $HexNumber & @CRLF & _
    "err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _
    "err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & _
    "err.source is: " & @TAB & $oMyError.source & @CRLF & _
    "err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _
    "err.helpcontext is: " & @TAB & $oMyError.helpcontext _
    )
    SetError(1); to check for after this function returns
    EndFunc ;==>MyErrFunc

    [/autoit]

    Einmal editiert, zuletzt von Duckbone (19. Mai 2013 um 20:36)

  • Am einfachsten geht das wohl so, auch wenn ich es nicht testen kann:

    [autoit]


    Global $showError = True
    $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc") ; --> error handling
    ; ...
    ; Wunsch: Hier Errorhandling ausschalten
    $showError = False
    If $result.Fields( "id" ).Value = "" Then MsgBox(0,"","Datensatz nichtvorhanden, ok") ; --> hier kommt dann die Meldung vom Errorhandler
    ; Wunsch: Hier Errorhandling wieder aktivieren
    $showError = True
    ;...

    [/autoit][autoit][/autoit][autoit]

    Func MyErrFunc()
    ;...
    if $showError = False then
    consolewrite("hidden Error:" & @crlf & "...der selbe mist der sonst in der msgbox landen würde...")
    else
    MsgBox(0,"COM Error Test", "... dein fehler gedöns")
    endif
    SetError(1); to check for after this function returns
    EndFunc ;==>MyErrFunc

    [/autoit]

    Sinnvollerweise schreibste den Fehler String erst in eine Variable und fügst diesen dann in der if...then...else Bedingung in die msgbox bzw. consolewrite Funktion ein. Alternativ wenns dich wirklich garnicht juckt kannste statt consolewrite natürlich auch einfach ein return reinsetzen.