MSSQL Problem

  • Hallo autoit,

    ich habe folgendes Problem.
    Zwar wenn ich aus der Datenbank die wiefolgt aufgebaut ist:

    Code
    JID|StrUserID|password|Status|GMrank|Name|Email|sex|certificate_num|address|postcode|phone|mobile|regtime|reg_ip|Time_log|freetime|sec_primary|sec_content|AccPlayTime|LatestUpdateTime_ToPlayTime|Play123Time


    versuche anhant der StrUserID alles auszulesen kommt ein

    error
    Code
    ==> The requested action with this object has failed.:
    $result = $adCN.Execute($sQuery)
    $result = $adCN.Execute($sQuery)^ ERROR

    Sofern ich alles anhant der JID auslese klappt es wunderbar.

    So klappt es nicht:

    [autoit]


    $constrim = "DRIVER={SQL Server};SERVER=MEINEIP;DATABASE=MEINEDATENBANK;uid=USERNAME;pwd=PASSWORD;"
    $adCN = ObjCreate("ADODB.Connection") ;<==Create SQL connection
    $adCN.Open($constrim) ;<==Connect with required credentials
    If @error Then
    MsgBox(0, "ERROR", "Failed to connect to the database")
    Exit
    Else
    ;~ MsgBox(0, "Success!", "Connection to database successful!")
    EndIf
    $sQuery = "select * from TB_User where StrUserID=" & GUICtrlRead($Input1) & ""
    $result = $adCN.Execute($sQuery)
    MsgBox(0, "", $result.Fields("StrUserID" ).Value)
    $adCN.Close ;==>Close the database

    [/autoit]


    So klappt es:

    [autoit]


    $constrim = "DRIVER={SQL Server};SERVER=MEINEIP;DATABASE=MEINEDATENBANK;uid=USERNAME;pwd=PASSWORD;"
    $adCN = ObjCreate("ADODB.Connection") ;<==Create SQL connection
    $adCN.Open($constrim) ;<==Connect with required credentials
    If @error Then
    MsgBox(0, "ERROR", "Failed to connect to the database")
    Exit
    Else
    ;~ MsgBox(0, "Success!", "Connection to database successful!")
    EndIf
    $sQuery = "select * from TB_User where JID=" & GUICtrlRead($Input1) & ""
    $result = $adCN.Execute($sQuery)
    MsgBox(0, "", $result.Fields("StrUserID" ).Value)
    $adCN.Close ;==>Close the database

    [/autoit]

    Hoffe ihr könnt mir nun helfen

    Einmal editiert, zuletzt von Awesome (11. Dezember 2011 um 16:21)

  • Verpass Deinem Skript mal einen COM error handler. Ein Beispiel findest Du in der Funktion ObjEvent.

    [autoit]

    $oMyError = ObjEvent("AutoIt.Error","MyErrFunc") ; Initialize a COM error handler

    ; Dein Code kommt hierher

    ; This is my custom defined error handler
    Func MyErrFunc()

    Msgbox(0,"AutoItCOM 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 & hex($oMyError.number,8) & @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 _
    )
    EndFunc

    [/autoit]
  • Kriegst Du eine MsgBox vom Error handler?

  • Yap bekomme ich.

    Gebe in meinem Input "testadmin" ein, diesen eintrag gibt es auch.

    Code
    [0]|JID|StrUserID|password|Status|GMrank|Name|Email|sex|certificate_num|address|postcode|phone|mobile|regtime|reg_ip|Time_log|freetime|sec_primary|sec_content|AccPlayTime|LatestUpdateTime_ToPlayTime|Play123Time
    [1]|1417|testadmin|cfba|1|1|GM01|main@mail.de||sec|||||||||1|1|7624|1322316816|0


    [autoit]

    $oMyError = ObjEvent("AutoIt.Error","MyErrFunc"); Initialize a COM error handler
    $constrim = "DRIVER={SQL Server};SERVER=ip;DATABASE=dt;uid=user;pwd=pw;"
    $adCN = ObjCreate("ADODB.Connection") ;<==Create SQL connection
    $adCN.Open($constrim) ;<==Connect with required credentials
    If @error Then
    MsgBox(0, "ERROR", "Failed to connect to the database")
    Exit
    Else
    ;~ MsgBox(0, "Success!", "Connection to database successful!")
    EndIf
    $sQuery = "select * from TB_User where StrUserID=" & GUICtrlRead($Input1) & ""
    $result = $adCN.Execute($sQuery)
    MsgBox(0, "", $result.Fields("JID" ).Value)
    $adCN.Close ;==>Close the database

    [/autoit]
  • Du fragst nach einem String ab. MSSQL scheint das aber als Spaltennamen zu interpretiren. Versuch mal, den String in Quotes zu setzen.

    [autoit]

    $sQuery = "select * from TB_User where StrUserID='" & GUICtrlRead($Input1) & "'"

    [/autoit]
  • Was Du natürlich noch unbedingt machen musst, ist den Input des Users auf sinnvolle und gültige Werte abzufragen. Stichwort: SQL Injection.

  • Das programm läuft eh auf einem root.

    Wie kann ich prüfen, ohne das das ganze Programm abschmiert ob es einen eintrag gibt oder nicht.

    [autoit]

    $sQuery = "select * from SK_Silk where JID=" & $jid & ""
    $result = $adCN.Execute($sQuery)
    $silk = $result.Fields("silk_own" ).Value
    ;~ GUICtrlSetData($Label3, $result.Fields("silk_own" ).Value)
    $adCN.Close ;==>Close the database

    [/autoit]

    Sofern die JID in der Tabelle drin steht, schmiert das Programm nicht ab.
    Wenn aber diese JID nicht vorhanden ist schmiert es mir ab:

    Code
    $silk = $result.Fields("silk_own" ).Value
    $silk = $result.Fields("silk_own" ).Value^ ERROR

    Da er diese zeile silk_own bzw. den Wert der nicht vorhanden JID finden kann

  • Prüfe das Attribut RecordCount. Hier steht drin, wie viele Datensätze Deine Abfrage ergeben hat. Du musst unbedingt bei jeder Abfrage damit rechnen, dass 0,1 oder mehrere Sätze zurückgegeben werden.
    Such Dir im Internet zuerst ein gutes ADO Tutorial, dann geht's einfacher.

  • Habs nun gelöst bekommen.
    Danke :)

    [autoit]

    $sQuery1 = "select * from SK_Silk where JID=" & $jid & ""
    $result1 = $adCN.Execute($sQuery1)
    Local $Type, $Output
    With $result1
    If .RecordCount Then
    While Not .EOF
    $Type = .Fields("silk_own" ).Value
    GUICtrlSetData($Label3, $Type)
    .MoveNext
    WEnd
    EndIf
    EndWith
    $adCN.Close ;==>Close the database

    [/autoit]