MS SQL Abfrage abfangen, wenn kein Ergebnis geliefert wird

  • Guten Morgen,

    folgendes kleines Problem habe ich. Wenn ich mit meinen Script eine Abfrage an eine MSSQL Datenbank absetze, wo kein Ergebnis geliefert wird, dann schmiert mir mein Script ab.

    hier mal ein wenig Code:

    [autoit]


    If $Suchkategorie = "Entsorgungsnachweis ID" Then
    Local $SQLQuery = _MSSQL_Query($sqlCon, "select n.nachweis_id, n.nachweisnr, n.vorlaeufigeennr, n.angelegt_am, u.username, n.gueltig_von, n.gueltig_bis, n.relevant, n.entsorgungsmenge_max, n.entsorgungsmenge_init, n.entsorgungsmenge_akt, n.deaktiviert_am, n.geloescht_am, t.behoerdliche_nummer, tr.KUERZEL, t.NAME from nachweis n left join teilnehmer t on n.teilnehmer_id = t.teilnehmer_id left join teilnehmerrolle tr on t.teilnehmerrolle_id = tr.teilnehmerrolle_id left join users u on n.angelegt_durch = u.user_id where n.nachweis_id = " & $Suchbegriff & ";")
    $aSQLQueryErgebnis = $SQLQuery.GetRows
    If Not IsArray($aSQLQueryErgebnis) Then
    MsgBox(48, 'Information', 'Die Suche enthält keine Daten')
    Else

    [/autoit]


    Leider greift hier Zeile 4 bis 6 nicht.
    Kann mir bitte einer mal sagen, was ich falsch mache ?

    Danke

    Einmal editiert, zuletzt von HassanMullah (17. Juli 2013 um 14:59) aus folgendem Grund: Hilfe nach ObjEvent durchsuchen.

    • Offizieller Beitrag

    Leider greift hier Zeile 4 bis 6 nicht.


    Das ist auch korrekt. Es wird in jedem Fall ein Array zurückgeliefert - nur eben ohne Inhalt. Ich arbeite zwar nicht mit MS SQL, aber grundsätzlich ist das Verfahren wohl ähnlich. Dieses Problem existiert wenn ich mich recht erinnere, genau so in SQLite. Um auf Inhalt zu prüfen verwende den Zähler ( .Count oder .RowsCount ? ).

  • Hi BugFix

    habe das mal so geändert, aber es greift leider nicht. Mache ich was falsch ?

    [autoit]


    If $Suchkategorie = "Entsorgungsnachweis ID" Then
    Local $SQLQuery = _MSSQL_Query($sqlCon, "select n.nachweis_id, n.nachweisnr, n.vorlaeufigeennr, n.angelegt_am, u.username, n.gueltig_von, n.gueltig_bis, n.relevant, n.entsorgungsmenge_max, n.entsorgungsmenge_init, n.entsorgungsmenge_akt, n.deaktiviert_am, n.geloescht_am, t.behoerdliche_nummer, tr.KUERZEL, t.NAME from nachweis n left join teilnehmer t on n.teilnehmer_id = t.teilnehmer_id left join teilnehmerrolle tr on t.teilnehmerrolle_id = tr.teilnehmerrolle_id left join users u on n.angelegt_durch = u.user_id where n.nachweis_id = " & $Suchbegriff & ";")
    $aSQLQueryErgebnis = $SQLQuery.GetRows
    Local $aSQLQueryErgebnisCheck = $SQLQuery.Count; wurd auch mit $SQLQuery.RowsCount probiert
    If Not IsArray($aSQLQueryErgebnisCheck) Then
    MsgBox(48, 'Information', 'Die Suche enthält keine Daten')
    Else

    [/autoit]
  • Es will nicht werden ?(?(?(

    [autoit]


    If $Suchkategorie = "Entsorgungsnachweis ID" Then
    Local $SQLQuery = _MSSQL_Query($sqlCon, "select n.nachweis_id, n.nachweisnr, n.vorlaeufigeennr, n.angelegt_am, u.username, n.gueltig_von, n.gueltig_bis, n.relevant, n.entsorgungsmenge_max, n.entsorgungsmenge_init, n.entsorgungsmenge_akt, n.deaktiviert_am, n.geloescht_am, t.behoerdliche_nummer, tr.KUERZEL, t.NAME from nachweis n left join teilnehmer t on n.teilnehmer_id = t.teilnehmer_id left join teilnehmerrolle tr on t.teilnehmerrolle_id = tr.teilnehmerrolle_id left join users u on n.angelegt_durch = u.user_id where n.nachweis_id = " & $Suchbegriff & ";")
    $aSQLQueryErgebnis = $SQLQuery.GetRows
    Local $aSQLQueryErgebnisCheck = $aSQLQueryErgebnis.Count; auch hier wurde mit $aSQLQueryErgebnis.RowsCount probiert
    If Not IsArray($aSQLQueryErgebnisCheck) Then
    MsgBox(48, 'Information', 'Die Suche enthält keine Daten')
    Else

    [/autoit]


    Frage: Ist die Syntax an sich schon richtig, oder ? Vielleicht heißt das hier ja nicht .count oder .rowscount sondern irgendwie anderst. Wo kann ich denn solche Informationen im Internet finden ?

    • Offizieller Beitrag

    Ob die Syntax richtig ist, kann ich nicht sagen. Ich arbeite mit Firebird, da ist es zum Bsp. unnötig "left join" explizit anzugeben, weil das die Standardabfrage ist. Wobei, wenn man es angibt, sollte man eigentlich "inner/outer" mit ergänzen? Aber das kann auch syntaxspezifisch in den Dialekten variieren.

    Wo findest du Infos: Googeln nach "MSDN MySQL SUCHBEGRIFF"

  • Hi,

    das Problem hatte ich auch und es lässt sich auch beheben, ich muss nur mal den Code raussuchen und poste es dann als Edit :)

    Wichtig ist immer erstmal einen Count(*) durchzuführen um zu sehen ob was zurückgegeben werden kann, selbst wenn Count 0 sein sollte weil kein Treffer in der Abfrage gelandet wurde wird immernoch eine Zeile mit eben "0" zurückgegeben :)

    Edit:

    So schaut eine Abfrage (MySQL) bei mir aus:

    $result = $dbconnect.execute("Select Count(*) from TabelleX;")

    $count = $result.GetRows
    If Not IsArray($count) Then
    MsgBox(0, 'Fehler 2002', 'Fehler beim Auslesen der Daten aus der Datenbank')
    EndIf

    If $count[0][0] <> 0 Then

    $result = $dbconnect.execute("Select * from TabelleX;")

    Endif

    Gruß

    Prajoss

    "Never touch a running System!"

    Einmal editiert, zuletzt von Prajoss (17. Juli 2013 um 11:49)

  • Also ich mach das mit einer ganz normalen Query SELECT * FROM ...
    Wenn dann $aRow[0] = "" ist, hat er auch nix gefunden. So ist es jedenfalls in SQLite, ob es bei dir auch klappt weiß ich nicht.

    So suche ich z.B. nach der nächsten freien Kundennummer in meiner DB.

    [autoit]

    While 1
    _SQLite_QuerySingleRow($hDB, "SELECT * FROM Kunden WHERE Kunden_Nr = '" & StringFormat("%06s", $_iNo) & "';", $_aRow)
    If $_aRow[0] = "" Then ExitLoop
    $_iNo += 1
    WEnd

    [/autoit]
  • @m-obi: Deine Lösung hört sich eigentlich sehr schick an, aber wenn ich den Code von der UDF richtig interpretiere, kann ich das damit nicht abbilden. Ich werden die Lösung von Prajoss mal testen

    [autoit]

    ;===============================================================================
    ;
    ; Function Name....: _MSSQL_Query
    ; Description......: Send a Query to the Database
    ; Syntax...........: _MSSQL_Query($iSQLCon, $iQuery)
    ; Parameter(s).....: $iSQLCon = $oConnectionObj = Object, returned by _MSSQL_Con
    ; $iQuery = MSSQL Query
    ; Return Value(s)..: Success - Returns the Response from the server
    ;
    ;===============================================================================
    Func _MSSQL_Query($iSQLCon, $iQuery)
    If IsObj($iSQLCon) Then
    Return $iSQLCon.execute($iQuery)
    EndIf
    EndFunc ;==>_MSSQL_Query

    [/autoit]
  • Klappt es denn so?

    [autoit]

    If $Suchkategorie = "Entsorgungsnachweis ID" Then
    Local $SQLQuery = _MSSQL_Query($sqlCon, "select n.nachweis_id, n.nachweisnr, n.vorlaeufigeennr, n.angelegt_am, u.username, n.gueltig_von, n.gueltig_bis, n.relevant, n.entsorgungsmenge_max, n.entsorgungsmenge_init, n.entsorgungsmenge_akt, n.deaktiviert_am, n.geloescht_am, t.behoerdliche_nummer, tr.KUERZEL, t.NAME from nachweis n left join teilnehmer t on n.teilnehmer_id = t.teilnehmer_id left join teilnehmerrolle tr on t.teilnehmerrolle_id = tr.teilnehmerrolle_id left join users u on n.angelegt_durch = u.user_id where n.nachweis_id = " & $Suchbegriff & ";")
    $aSQLQueryErgebnis = $SQLQuery.GetRows
    If $aSQLQueryErgebnis[0] = "" Then
    MsgBox(48, 'Information', 'Die Suche enthält keine Daten')
    Else

    [/autoit]
  • Also das will alles nicht so recht funktionieren :(

    Beispiel 1:

    [autoit]


    If $Suchkategorie = "Entsorgungsnachweis ID" Then
    Local $SQLQuery = _MSSQL_Query($sqlCon, "select n.nachweis_id, n.nachweisnr, n.vorlaeufigeennr, n.angelegt_am, u.username, n.gueltig_von, n.gueltig_bis, n.relevant, n.entsorgungsmenge_max, n.entsorgungsmenge_init, n.entsorgungsmenge_akt, n.deaktiviert_am, n.geloescht_am, t.behoerdliche_nummer, tr.KUERZEL, t.NAME from nachweis n left join teilnehmer t on n.teilnehmer_id = t.teilnehmer_id left join teilnehmerrolle tr on t.teilnehmerrolle_id = tr.teilnehmerrolle_id left join users u on n.angelegt_durch = u.user_id where n.nachweis_id = " & $Suchbegriff & ";")
    $aSQLQueryErgebnis = $SQLQuery.GetRows
    If $aSQLQueryErgebnis[0] = "" Then
    MsgBox(48, 'Information', 'Die Suche enthält keine Daten')
    Else

    [/autoit]

    bringt folgende Consolenausgabe:

    Code
    Z:\AutoIT\Projekte\Eigene\SQLator\SQLator_V1.0.0.au3 (579) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    If $aSQLQueryErgebnis[0] = "" Then
    If ^ ERROR
    ->13:51:11 AutoIT3.exe ended.rc:1
    >Exit code: 1    Time: 21.677

    wobei Zeile 579 hier im Beispiel Zeile 4 ist.

    Beispiel 2:
    Ich lasse das Array mal ausgeben

    [autoit]


    If $Suchkategorie = "Entsorgungsnachweis ID" Then
    Local $SQLQuery = _MSSQL_Query($sqlCon, "select n.nachweis_id, n.nachweisnr, n.vorlaeufigeennr, n.angelegt_am, u.username, n.gueltig_von, n.gueltig_bis, n.relevant, n.entsorgungsmenge_max, n.entsorgungsmenge_init, n.entsorgungsmenge_akt, n.deaktiviert_am, n.geloescht_am, t.behoerdliche_nummer, tr.KUERZEL, t.NAME from nachweis n left join teilnehmer t on n.teilnehmer_id = t.teilnehmer_id left join teilnehmerrolle tr on t.teilnehmerrolle_id = tr.teilnehmerrolle_id left join users u on n.angelegt_durch = u.user_id where n.nachweis_id = " & $Suchbegriff & ";")
    $aSQLQueryErgebnis = $SQLQuery.GetRows
    _ArrayDisplay($aSQLQueryErgebnis, "Meine Suche")
    ;~ If $aSQLQueryErgebnis[0] = "" Then
    ;~ MsgBox(48, 'Information', 'Die Suche enthält keine Daten')
    ;~ Else

    [/autoit]


    Als Ergebnis bekomme ich bei einem gültigen Wert

    Code
    [0]|123||NEU-123-42|1251709308852|abc@de.ef|1170111600000|1327878000000|0|500|0|0|||E31306299|ELF|LALA

    bei einem ungültigen Wert fliegt mir die Anwendung wieder um die Ohren mit

    Code
    Z:\AutoIT\Projekte\Eigene\SQLator\SQLator_V1.0.0.au3 (577) : ==> The requested action with this object has failed.:
    $aSQLQueryErgebnis = $SQLQuery.GetRows
    $aSQLQueryErgebnis = $SQLQuery.GetRows^ ERROR
    ->14:07:34 AutoIT3.exe ended.rc:1
    >Exit code: 1    Time: 122.634

    wobei die Zeile 577 hier im Beispiel die Zeile 3 ist.

    Noch irgend eine Idee ?


    Edit: Ich habe es jetzt mit "ObjEvent" umschifft ... vielleicht nicht elegant, aber es funktioniert.

    Einmal editiert, zuletzt von HassanMullah (17. Juli 2013 um 14:59)

  • aus meiner MSSQL UDF, etwas umgewandelt ;)

    Spoiler anzeigen
    [autoit]


    Local $SQLQuery = _MSSQL_Query($sqlCon, "select n.nachweis_id, n.nachweisnr, n.vorlaeufigeennr, n.angelegt_am, u.username, n.gueltig_von, n.gueltig_bis, n.relevant, n.entsorgungsmenge_max, n.entsorgungsmenge_init, n.entsorgungsmenge_akt, n.deaktiviert_am, n.geloescht_am, t.behoerdliche_nummer, tr.KUERZEL, t.NAME from nachweis n left join teilnehmer t on n.teilnehmer_id = t.teilnehmer_id left join teilnehmerrolle tr on t.teilnehmerrolle_id = tr.teilnehmerrolle_id left join users u on n.angelegt_durch = u.user_id where n.nachweis_id = " & $Suchbegriff & ";")
    If Not $SQLQuery.EOF Then ; Wenn die Abfrage nicht leer ist
    $aSQLQueryErgebnis = $SQLQuery.GetRows() ; Zeilen abfragen
    Else ; Abfrage enthält keine Daten
    MsgBox(16, "Fehler", "Abfrage lieferte kein Ergebnis")
    EndIf

    [/autoit]

    --EDIT--

    Da du ja sowieso meine UDF benutzt, kannst du auch mit _MSSQL_GetRecords arbeiten :

    Spoiler anzeigen
    [autoit]

    $Columns = "n.nachweis_id, n.nachweisnr, n.vorlaeufigeennr, n.angelegt_am, u.username"
    $Columns &= ", n.gueltig_von, n.gueltig_bis, n.relevant, n.entsorgungsmenge_max"
    $Columns &= ", n.entsorgungsmenge_init, n.entsorgungsmenge_akt, n.deaktiviert_am, n.geloescht_am"
    $Columns &= ", t.behoerdliche_nummer, tr.KUERZEL, t.NAME"
    $Conditions = "left join teilnehmer t on n.teilnehmer_id = t.teilnehmer_id "
    $Conditions &= "left join teilnehmerrolle tr on t.teilnehmerrolle_id = tr.teilnehmerrolle_id "
    $Conditions &= "left join users u on n.angelegt_durch = u.user_id where n.nachweis_id = '" & $Suchbegriff & "'"
    _MSSQL_GetRecord($sqlCon, "nachweis n", $Columns, $Conditions)

    [/autoit]

    Da sind die Fehlerabfragen ja bereits vorhanden