Verbindung zu MS SQL Express 2005

  • Hallo Leute,

    habe mir diesmal was viel schweres vorgenommen und hoffe, dass ich nicht scheitern werde. Mit eurer Hilfe schon mal gar nicht:

    Mein Projekt soll folgendes erfüllen: Eine xls Datei auslesen und die Datensätze(Zeilenweise) und diese dann auf meinen MS SQL Server abspeichern.
    - xls auslesen, habe ich geschafft.
    - Eine Verbindung zu meinem MS SQL kriege ich irgend wie nicht hin, vielleicht könnt ihr mir dabei helfen:

    [autoit]

    #include <_SQL.au3>
    $mysrv = "IP"
    $mydbs = "NamederDatenbank"
    $user = "user"
    $pw = "passwort"

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

    $conn = ObjCreate( "ADODB.Connection" )
    $DSN = "DRIVER={SQL Server};SERVER="&$mysrv&";DATABASE="&$mydbs&";UID="&$user&";PWD="&$pw&";"
    $conn.Open($DSN)
    $rs = ObjCreate( "ADODB.RecordSet" )
    $rs.Open( "SELECT @@VERSION AS myVersion", $conn )
    MsgBox(0, "AutoIT-SQL Result", "Value = " & $rs.Fields( "myVersion" ).Value )
    $conn.close

    [/autoit]

    Das ganze Endet mit einer Fehlermeldung:
    [Blockierte Grafik: http://img94.imageshack.us/img94/2659/aufzeichnenpw.jpg]

    Was sagt ihr?

    Einmal editiert, zuletzt von Remax (16. August 2010 um 13:53)

  • ich benutze für die verbindung zu sql 2000 und sql 2008 diese Funktionen:

    Spoiler anzeigen
    [autoit]

    ; ------------------------------------------------------------------------------
    ;
    ; AutoIt Version: 3.1.1 (beta)
    ; Language: English
    ; Description: Functions to handle SQL databases.
    ; Author Chris Lambert
    ; ------------------------------------------------------------------------------

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

    ;#include-once

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

    Func _DisplayError($vText)
    MsgBox(0 + 16 + 262144, "SQL Error", $vText)
    EndFunc ;==>_DisplayError

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

    Func _SQLRegisterErrorHandler($Func = "_SQLErrFunc")
    If ObjEvent("AutoIt.Error") = "" Then $MSSQLObjErr = ObjEvent("AutoIt.Error", $Func)
    EndFunc ;==>_SQLRegisterErrorHandler

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

    Func _SQLUnRegisterErrorHandler()
    $MSSQLObjErr = ""
    EndFunc ;==>_SQLUnRegisterErrorHandler

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

    Func _SQLStartup()
    Dim $SQLErr
    $adCN = ObjCreate("ADODB.Connection") ;<==Create SQL connection
    If IsObj($adCN) Then
    $sqlLastConnection = $adCN
    Return $adCN
    Else
    Return SetError(1, 0, 0)
    EndIf
    EndFunc ;==>_SQLStartup

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

    Func _SQLConnect($ConHandle, $server, $db, $username, $password)
    Dim $SQLErr
    If $ConHandle = -1 Then $ConHandle = $sqlLastConnection
    $ConHandle.Open("DRIVER={SQL Server};SERVER=" & $server & ";DATABASE=" & $db & ";uid=" & $username & ";pwd=" & $password & ";") ;<==Connect with required credentials
    If Not @error Then Return 1
    Return SetError(1, 0, 0)
    EndFunc ;==>_SQLConnect

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

    Func _SQLClose($ConHandle = -1)
    If $ConHandle = -1 Then $ConHandle = $sqlLastConnection
    $ConHandle.Close
    EndFunc ;==>_SQLClose

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

    Func _SQLExecute($ConHandle = -1, $query = "")
    Dim $SQLErr
    Local $ret

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

    If $ConHandle = -1 Then $ConHandle = $sqlLastConnection
    $ret = $ConHandle.Execute($query)

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

    If @error Then Return SetError(1, 0, 0)
    Return $ret
    EndFunc ;==>_SQLExecute

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

    Func _SQLGetDataAsString($objquery, $ReturnColumnNames = 1, $delim = "|")
    If Not IsObj($objquery) Then
    $SQLErr = "Data passed is an invalid object"
    Return SetError(1, 0, 0)
    EndIf

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

    Dim $ret
    Local $i
    With $objquery
    If $ReturnColumnNames Then
    For $i = 0 To .Fields.Count - 1 ;get the column names and put into 0 array element
    $ret &= .Fields($i).Name & $delim
    Next
    If StringRight($ret, 1) = $delim Then $ret = StringTrimRight($ret, 1)
    $ret &= @CRLF
    EndIf

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

    While Not .EOF
    For $i = 0 To .Fields.Count - 1
    $ret &= .Fields($i).Value & $delim
    Next
    If StringRight($ret, 1) = $delim Then $ret = StringTrimRight($ret, 1)
    $ret &= @CRLF
    .MoveNext; Move to next row
    WEnd
    EndWith
    Return $ret
    EndFunc ;==>_SQLGetDataAsString

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

    Func _SQLGetData2D($objquery, $ReturnColumnNames = 1)

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

    If Not IsObj($objquery) Then
    $SQLErr = "Data passed is an invalid object"
    Return SetError(1, 0, 0)
    EndIf

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

    Dim $ret
    Dim $SQLErr
    Local $i, $aTmp

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

    With $objquery

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

    $ret = .GetRows()

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

    If IsArray($ret) Then
    $Dims = UBound($ret, 2)
    $Rows = UBound($ret)

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

    If $ReturnColumnNames Then

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

    ReDim $ret[$Rows + 1][$Dims];Adjust the array to fit the column names and move all data down 1 row

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

    For $x = $Rows To 1 Step -1
    For $y = 0 To $Dims - 1
    $ret[$x][$y] = $ret[$x - 1][$y]
    Next
    Next
    ;Add the coloumn names
    For $i = 0 To $Dims - 1 ;get the column names and put into 0 array element
    $ret[0][$i] = .Fields($i).Name
    Next
    EndIf;$ReturnColumnNames
    Else
    SetError(2)
    $SQLErr = "Unable to retreive data"
    EndIf;IsArray()

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

    ;Old method not used anymore but left in commented out until the new method is proven to have no issues
    ;While NOT .EOF
    ; ReDim $ret[UBound($ret, 1) + 1][Ubound($ret,2)]; get each row of data
    ; For $i = 0 To .Fields.Count - 1
    ; $ret[UBound($ret, 1) - 1][$i] = .Fields($i).Value
    ; Next
    ;.MoveNext; Move to next row
    ;WEnd
    EndWith
    Return $ret
    EndFunc ;==>_SQLGetData2D

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

    ;custom error handler
    Func _SQLErrFunc()

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

    $SQLErr = $MSSQLObjErr.description
    SetError(1)

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

    EndFunc ;==>_SQLErrFunc

    [/autoit]


    damit funktioniert es bei mir einwandfrei.. Das klappt allerdings nur mit ODBC.

    Franz

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • MSDE oder der große Bruder, bei MSDE/Express ist TCP/IP bei den Protokollen per default aus.
    Kannst Du im Konfigurationsmanager aktivieren falls Du den Zugriff so gewählt hast und der Server nicht auf deinem PC (wo AutoIT) läuft.

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Hallo Franz,

    die Funktionen gefallen mir.
    Wie setze ich diese eine? Um eine Verbindung aufzubauen muss ich die Parameter mit der Func _SQLConnect aufrufen, doch wofür steht $ConHandle? Was muss ich da eingeben?

    [autoit]

    $ConHandle= ""
    $server="IP"
    $db="mydb"
    $user="user"
    $pass="passwort"

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

    _SQLConnect($ConHandle, $server, $db, $username, $password)

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

    _SQLExecute($ConHandle, "Select * from mydb")

    [/autoit]

    Einmal editiert, zuletzt von Remax (13. August 2010 um 09:06)

  • probiers mal so:

    Spoiler anzeigen
    [autoit]


    Global $sqlLastConnection
    Global $SQLErr
    Global $MSSQLObjErr
    Global $sqlIP = "IP Adresse"
    Global $sqlDB = "Datenbankname"
    Global $sqlcommand = "select * from blablabla"
    Global $sqluser = "" ;kann bei mir leer bleiben, weil schon im odbc hinterlegt.
    Global $sqlpasswd = "" ;kann bei mir leer bleiben, weil schon im odbc hinterlegt.

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

    _SQLRegisterErrorHandler()
    $con = _SQLStartup()
    If @error Then MsgBox(0, "Error", "Error starting ADODB.Connection")
    $sql = _SQLConnect(-1, $sqlIP, $sqlDB, $sqluser, $sqlpasswd)
    If @error Then _DisplayError($SQLErr)
    $data = _SQLExecute(-1, $sqlcommand)
    $adata = _SQLGetData2D($data)
    If @error Then _DisplayError($SQLErr)
    _SQLClose()
    _Arraydisplay($adata)

    [/autoit]

    gibt array zurück mit den Inhalt der Tabelle

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • Zitat

    SQL Server 2005.


    Express oder der große Bruder, bei der Express Installation wird wenn man es nicht ändert der Instanzname SQLEXPRESS vorgeschlagen.
    Schau mal unter den Diensten wie er heisst. Dann wäre der Servername hostname\sqlexpress

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Es handelt sich dabei um den großen Bruder und der Server ist nicht der localhost. Hab eine feste IP in meinem Netzwerk, Idioten sicher. Leider bin ich ein Idiot First Class... Deswegen klappt das nun auch nicht.

  • wie sprichst du die Tabelle an?

    vielleicht hilft hier nochmal die komplette addressierung mit zu geben.

    Code
    [DATENBANK].[dbo].[TABELLE]

    Blöde frage aber der ODBC Test schlägt nicht fehl oder ?

    Franz

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • Hallo Franz,

    habe bereits wie du vermutet, dass es an der Adressierung der Tabelle liegen könnte.

    Aber der findet ja nicht einmal den Server, wie du oben sehen kannst. Obwohl ich die feste IP des Server angebe...

    Du erwähnst ein ODBC Test, wie läuft er genauer ab?

  • Hallo,

    unter:
    ODBC Datenquellen (system-dsn) die verbindung auswählen und dann auf konfigurieren klicken.
    den assistenten mit fertigstellen beenden. Dann kommt ein Fenster mit dem Button "Datenquellen testen".

    wenn der erfolgreich ist, dann würde mich das wundern... Kannst du mit anderen Anwendungen auf den SQL Server zugreifen, die ODBC verwenden?

    Franz

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • Danke Franz für deine Unterstützung...

    hab ich dir schon erzählt, dass ich blind bin und nicht lesen kann?

    Ja das stimmt, hatte nämlich überlesen, dass bei dem Server doch die ExpressEdition drauf ist... also hostname\sqlexpress.....

    <- Trottel, sorry!

  • ich weiß schon warum ich nach Express/MSDE gefragt habe :)

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o