ODBC DSN testen

  • Hallo
    ich habe gesehen das man mit AUTOIT eine ODBC Quelle anlegen kann (Registryeinträge). Wie kann ich aber nun per AutoIT diese ODBC Schnittstelle testen ? Mir geht es nämlich um die Rückgabewerte dieser ODBC Schnittstelle (User / Password successful oder nicht)

    Danke für Eure Hilfe

  • $ado = ObjCreate( "ADODB.Connection" ) ; Create a COM ADODB Object with the Beta version

    With $ado
    .ConnectionString =("Provider='iSeries Access ODBC Driver';Data Source='Name';User Id='user';Password='password';")
    .Open
    EndWith


    Bekomme hier leider aber immer nur den Fehler das er den .open nicht durchführen kann.

    Fehler: The requested action with this object has failed.:

    Hast jemand eine Idee ?

    • Offizieller Beitrag

    Hi,

    hilft das?

    http://www.autoitscript.com/forum/index.php?showtopic=15220&hl=ODBC

    oder

    Spoiler anzeigen

    [AutoIt]$a = IsValidODBCLogin("server[\instance]", "sa", "password")
    MsgBox(4096, @error, $a)

    Func IsValidODBCLogin($sDSN, $sUID, $sPWD)
    Local Const $SQL_SUCCESS = 0
    Local Const $SQL_SUCCESS_WITH_INFO = 1
    Local Const $SQL_DRIVER_NOPROMPT = 0

    Local $henv ;Environment Handle
    Local $hdbc ;Connection Handle
    Local $iResult
    Local $ret = 0
    Local $szConn = "DRIVER=SQL Server;SERVER="

    Local $odbc_DLL = DllOpen("odbc32.dll")
    If $odbc_DLL = -1 Then
    SetError(-1)
    Return 0
    EndIf

    $szConn = $szConn & $sDSN & ";"
    If $sUID = "" Then
    $szConn = $szConn & "Trusted_Connection=yes;"
    Else
    $szConn = $szConn & "UID=" & $sUID & ";PWD=" & $sPWD & ";"
    EndIf


    ;Obtain Environment Handle
    $iResult = DllCall($odbc_DLL, "short", "SQLAllocEnv", "int_ptr", 0)
    $henv = $iResult[1]
    $iResult = $iResult[0]

    If $iResult <> $SQL_SUCCESS Then
    DllClose($odbc_DLL)
    SetError(-2)
    Return 0
    EndIf

    ;Obtain Connection Handle
    $iResult = DllCall($odbc_DLL, "short", "SQLAllocConnect", "int", $henv, "int_ptr", 0)
    $hdbc = $iResult[2]
    $iResult = $iResult[0]

    If $iResult <> $SQL_SUCCESS Then
    DllCall($odbc_DLL, "short", "SQLFreeEnv", "int", $henv)
    DllClose($odbc_DLL)
    SetError(-2)
    Return 0
    EndIf


    ;Test Connect Parameters
    $iResult = DllCall($odbc_DLL, "short", "SQLDriverConnect", "int", $hdbc, "hwnd", 0, _
    "str", $szConn, "short", -3, "str", 0, "short", -3, "short_ptr", 0, "short", 0)
    $iResult = $iResult[0]

    If $iResult <> $SQL_SUCCESS Then
    If $iResult = $SQL_SUCCESS_WITH_INFO Then
    ;The Connection has been successful, but SQLState Information
    ;has been returned
    $ret = 3
    EndIf
    Else
    $ret = 1
    EndIf
    DllCall($odbc_DLL, "short", "SQLFreeConnect", "int", $hdbc)
    DllCall($odbc_DLL, "short", "SQLFreeEnv", "int", $henv)
    If $ret = 3 Then
    $ret = 1
    SetError(1)
    ElseIf $ret = 0 Then
    SetError(-3)
    EndIf
    DllClose($odbc_DLL)
    Return $ret
    EndFunc ;==>IsValidODBCLogin


    So long,

    Mega

  • danke mega. werde mir das mal anschauen.

    bisher habe ich folgendes herausgefunden.

    _user()
    Msgbox(4096,"Titel2","Errorcode2: " & @error)

    Func _user()
    $objConnection = ObjCreate("ADODB.Connection")
    $objConnection.Provider = "IBMDA400"
    $objConnection.Properties("Data Source") = "NameSystem"
    $objConnection.Properties("User ID") = "user"
    $objConnection.Properties("Password") = "passwort"
    $objConnection.Open
    Msgbox(4096,"Tittel","Errorcode: " & @error)
    ;return
    EndFunc

    Wenn ich diese Funktion aufrufe und die richtigen Anmeldedaten hinterlege bekomme ich in der Msgbox eine 0 (connect). Ändere ich die Daten ab, dann läuft mein Script auf einen Fehler. Das würde heißen der Connect klappt.

    Nun will ich aber die Errormeldungen die da kommen natürlich abfangen und mir anzeigen lassen. Wie kann ich das denn bewerkstelligen ? Vielleicht ein tip wo ich suchen könnte ?

    Danke allen

  • Anmerkung zu obigen Post:
    Bei VB wird der fehlercode automatisch ausgegeben.
    Was muss ich denn bei Autoit noch tun um die Fehlermeldungen abzufangen ?
    Danke

  • Noch etwas:
    Die errors befinden sich in der Collection
    "objconnection.errors".

    Wie kann ich die denn nun in meinem Beispiel mit einer Schleife oder ähnlichem abfragen ?

    Noch etwas:
    Wenn in meinem Befehl objconnection.open ein Fehler auftritt, wie kann ich denn die Funktion zwingen nicht abzubrechen, sondern weiterzulaufen ?

    Ich denke der Fehler würde mir dann in die objconnection.errors geschrieben werden und die müsste ich nur auswerten, nur mein Script bricht einfach ab.

    Vielen Dank

    Einmal editiert, zuletzt von jmewald (22. März 2007 um 10:21)

  • Nach einigem Rumprobieren hats geklappt

    Anmeldung an der AS400 klappt, und je nachdem ob der User / Passwort / System falsch ist,kommen entsprechende Fehlermeldungen.

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


    $objConnection.Provider = "IBMDA400"
    $objConnection.Properties("Data Source") = "Systemname"
    $objConnection.Properties("User ID") = "User"
    $objConnection.Properties("Password") = "Password"
    $objConnection.open


    Func MyErrFunc()

    Msgbox(0,"Fehler bei Anmeldung iSeries","" & @CRLF & _
    "" & $oMyError.description & @CRLF )

    Endfunc

    So jetzt muss das ganze noch in ein Formular und Verschlüsselung eingebaut werden.

    Danke

  • hallo mega

    verwende _stringencrypt (klappt klasse)

    wie kann ich das thema eigentlich wieder schliessen, wenn es gelöst ist ?

    danke