Access (.accdb) Datenbank auslesen etc.

  • Hallo Leute =)

    Mein Quellcode steht zwar noch nicht, da ich grade erst anfange, aber ich habe bereits im Vorfeld eine Frage.

    Wie kann ich mithilfe von Autoit eine Datenbank öffnen, darin eine bestimmte Tabelle auswählen lassen und daraus bestimmte Spalten bzw. Zellen auslesen lassen?

    Geht das in etwa so wie beim Auslesen von Excel-Zellen?

  • MadCatz

    hier vorab schonmal was zum auslesen ...

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===========================================
    ; db test
    ;===========================================
    $dbname = "\\server\db_test.mdb"
    $tblname_1 = "test01" ;Tabelle 1
    $tblname_2 = "test02" ;Tabelle 2
    ;===========================================
    ; table test01
    ;===========================================
    $fldname_tbl1_1 = "User"
    $format = "Text(50)"
    $fldname_tbl1_2 = "PC" ;pc anmeldename
    $format = "Text(50)"
    ;===========================================
    ; table test02
    ;===========================================
    $fldname_tbl2_1 = "Terminal"
    $format = "Text(50)"
    $fldname_tbl2_2 = "PCNAME" ; pc name
    $format = "Text(50)"
    ;===========================================
    $query1 = "SELECT * FROM " & $tblname_1 & " WHERE PC = " & "'" & $user & "'"
    $query2 = "SELECT * FROM " & $tblname_2 & " WHERE PCNAME = " & "'" & $computer & "'"

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

    $strData1 = _ReadOneFld($query1, $dbname, $fldname_tbl1_1)
    $strData2 = _ReadOneFld($query2, $dbname, $fldname_tbl2_1)

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

    $strData1 = StringStripWS($strData1, 8)
    $strData2 = StringStripWS($strData2, 8)

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

    Msgbox(0,"", $strData1 & $strData2)

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

    ;------access DB auslesen -------------
    Func _ReadOneFld($_sql, $_dbname, $_field)
    Dim $_output
    $adoCon = ObjCreate("ADODB.Connection")
    $adoCon.Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & $_dbname)
    $adoRs = ObjCreate("ADODB.Recordset")
    $adoRs.CursorType = 1
    $adoRs.LockType = 3
    $adoRs.Open($_sql, $adoCon)

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

    With $adoRs
    If .RecordCount Then
    While Not .EOF
    $_output = $_output & .Fields($_field).Value & @CRLF
    .MoveNext
    WEnd
    EndIf
    EndWith
    $adoCon.Close
    Return $_output
    EndFunc ;==>_ReadOneFld

    [/autoit]

    hier gibt es noch den post, wenn es um access 2007 /2010 und x64 geht
    [ gelöst ] Verbindung zu Access 2010 DB nicht möglich

    gruß gmmg ;)

    3 Mal editiert, zuletzt von gmmg (25. Februar 2014 um 17:18)

  • Hallo Zusammen.

    Ich hab mich lange nicht mehr mehr gemeldet, da ich momentan ein anderes Projekt habe. Ich habe mich heute nochmal hier ran gesetzt und wollte mit Hilfe der von gmmg's geposteten UDF nochmal anfangen.

    Habe mir alles aus der UDF angesehen und verstehe natürlich nicht alles, aber egal.

    Naja jedenfalls habe ich das Gefühl, dass ich etwas Grundlegend falsch mache, bei meinen Tests eine ".mdb", als auch ein ".accdb" zu öffnen.

    In der UDF ist zum Besipiel dies zum öffnen einer Datenbank zufinden:

    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _AccessOpen
    ; Description ...: Open Microsoft Office Access File
    ; Parameters ....: $s_FilePath - File path and name
    ; $Options - Sets various options for the database, as specified in Remarks
    ; True Opens the database in exclusive (exclusive: A type of access to data in a database that is shared over a network.
    ; When you open a database in exclusive mode, you prevent others from opening the database.) mode.
    ; False (Default) Opens the database in shared mode.
    ; $ReadOnly - True if you want to open the database with read-only access, or False (default) if you want to open the database with read/write access.
    ; $Connect - Specifies various connection information, including passwords.
    ; Return values .: On Success - Returns database object linked to the opened file
    ; On Failure - Returns 0 and sets @ERROR
    ; @ERROR - 0 ($_AccessStatus_Success) = No Error
    ; - 1 ($_AccessStatus_GeneralError) = General Error
    ; - 3 ($_AccessStatus_InvalidDataType) = Invalid Data Type
    ; - 4 ($_AccessStatus_InvalidObjectType) = Invalid Object Type
    ; Author ........: Ayman Henry
    ; ADO Command ...: expression.OpenDatabase(Name, Options, ReadOnly, Connect)
    ; ===============================================================================================================================
    Func _AccessOpen($s_FilePath = "", $Options = False, $ReadOnly = False, $Connect = ";pwd=")
    Local $o_object, $o_MDBObj

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

    If $s_FilePath = "" Then Return 0 ; There is currently no way of read non existing db.
    If FileExists($s_FilePath) = 0 Then Return 0

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

    Local $result, $f_mustUnlock = 0, $i_ErrorStatusCode = $_AccessStatus_Success

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

    ; Setup internal error handler to Trap COM errors, turn off error notification
    Local $status = __AccessInternalErrorHandlerRegister()
    If Not $status Then __AccessErrorNotify("Warning", "_AccessOpen", _
    "Cannot register internal error handler, cannot trap COM errors", _
    "Use _AccessErrorHandlerRegister() to register a user error handler")
    Local $f_NotifyStatus = _AccessErrorNotify() ; save current error notify status

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

    _AccessErrorNotify(False)
    $o_object = ObjCreate("DAO.DBEngine.36")

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

    If Not IsObj($o_object) Or @error = $_AccessStatus_ComError Then
    $i_ErrorStatusCode = $_AccessStatus_NoMatch
    EndIf

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

    ; restore error notify and error handler status
    _AccessErrorNotify($f_NotifyStatus) ; restore notification status
    __AccessInternalErrorHandlerDeRegister()

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

    If Not $i_ErrorStatusCode = $_AccessStatus_Success Then
    ;$o_object = ObjCreate("Access.Application")
    ;$o_object = ObjCreate("DAO.DBEngine.36")

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

    If Not IsObj($o_object) Then
    __AccessErrorNotify("Error", "_AccessOpen", "", "Access Object Creation Failed")
    Return SetError($_AccessStatus_GeneralError, 0, 0)
    EndIf
    EndIf

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

    $o_MDBObj = __AccessOpenDB($o_object, $s_FilePath, $Options, $ReadOnly, $Connect)

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

    Return SetError(@error, 0, $o_MDBObj)
    EndFunc ;==>_AccessOpen

    [/autoit]

    Dabei sollte ja die Datenbank geöffnet werden, ob jetzt sichtbar oder nicht, wird mir aus der Funktion nicht erkenntlich.


    Jedenfalls denke ich, dass

    [autoit]

    _AccessOpen($s_FilePath = "", $Options = False, $ReadOnly = False, $Connect = ";pwd=")

    [/autoit]

    zeigt, dass es reicht den Ort und den Namen anzugeben, damit es funktioniert. Das sieht dann so bei mir aus.

    [autoit]

    $AccessPath = @ScriptDir&"\USB-Sticks-DB.accdb"
    _AccessOpen($AccessPath)

    [/autoit]


    Danach hab ich noch eine MsgBox, die mir den Pfad, den Namen, sowie den Error ausgibt. Der Pfad und Name wird mir richtig in der MsgBox angezeigt, aber ich bekomme dennoch immer dern Error 1.


    Ich weiß wirklich nicht wo mein Fehler im Verständnis liegt ?(?(?(?(?(?(

  • schon mal das beispiel mit angeschaut:

    Spoiler anzeigen
    [autoit]

    Func Example_AccessOpen()
    Local $o_DataBase = _AccessOpen(@ScriptDir & "\Test.mdb")
    If $o_DataBase = 0 Then
    MsgBox(0, "Information", "Database file is not found :-" & @CR & @ScriptDir & "\Test.mdb")
    Return
    Else
    MsgBox(0, "Information", "Database file was opened :-" & @CR & @ScriptDir & "\Test.mdb")
    EndIf

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

    _AccessClose($o_DataBase)
    EndFunc ;==>Example_AccessOpen

    [/autoit]

    wenn Rückgabewert = 0 dann nicht gefunden... oder meinst du @error??


    EDIT: ok, accdb überlesen, ist ja ne 2007er DB und nicht mehr älter..

    Einmal editiert, zuletzt von Torni (24. April 2014 um 16:47)

  • hallo,

    hier nochmal ein beispiel zum auslesen einer access accdb :)

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    ;--------- Modify the variables below as desired or applicable -------
    $dbname = "d:\dbtest.accdb"
    $tblname = "Tabelle1"
    $fldname01 = "Feld1"
    $format = "Text(50)"
    $fldname02 = "Feld2"
    $format = "Text(50)"

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

    $query = "SELECT * FROM "& $tblname & " WHERE Feld2 = 'test2'"
    $strData1 = _ReadOneFld($query, $dbname, $fldname01)

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

    ConsoleWrite( $query & @crlf & $strData1)
    MsgBox(0,"",$query & @crlf & "ergebnis: " & $strData1)

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

    ;------access DB auslesen -------------
    Func _ReadOneFld($_sql, $_dbname, $_field)
    Dim $_output
    $adoCon = ObjCreate("ADODB.Connection")
    $adoCon.Open("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & $dbname & ";")
    $adoRs = ObjCreate("ADODB.Recordset")
    $adoRs.CursorType = 1
    $adoRs.LockType = 3
    $adoRs.Open($_sql, $adoCon)

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

    With $adoRs
    If .RecordCount Then
    While Not .EOF
    $_output = $_output & .Fields($_field).Value & @CRLF
    .MoveNext
    WEnd
    EndIf
    EndWith
    $adoCon.Close
    Return $_output
    EndFunc ;==>_ReadOneFld

    [/autoit]

    gruß gmmg :)

  • Auf deinem Screenshot sieht man btw auch keine Datei namens "test.mdb". Also entweder ist diese hinter deiner msgbox versteckt oder du verwendest tatsächlich einen falschen Pfad worauf die Meldung ja hindeutet.

  • Was steht denn in der Scite console bei dir?

    Ich bekomme diesen Fehler

    Code
    --> Access.au3 Error from function _AccessOpen (Access Object Creation Failed)

    Dürfte aber wohl auch daran liegen, dass ich kein Access in meinem Office Paket habe...

  • ich hab jetzt mal den Quelltext von gmmg mir zur hilfe genommen und mal versucht das ganze auf meine Datenbank anzuwenden.

    Dazu hab ich halt nur ein paar Dinge ausgetauscht:

    [autoit]

    $dbname = "C:\Users\michflos\Documents\AutoIt\USB-Station\USB-Sticks-DB - Kopie.accdb"
    $tblname = "Stickübersicht : Tabelle"
    $fldname01 = "ID"
    ;~ $format = "Text(50)"
    $fldname02 = "Stickgröße-Hardware"
    ;~ $format = "Text(50)"

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

    $query = "SELECT * FROM "& $tblname & " WHERE Stickgröße-Hardware = '2GB'"
    $strData1 = _ReadOneFld($query, $dbname, $fldname01)

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

    ConsoleWrite( $query & @crlf & $strData1)
    MsgBox(0,"",$query & @crlf & "ergebnis: " & $strData1)

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

    Func _ReadOneFld($_sql, $_dbname, $_field)

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

    Dim $_output
    $adoCon = ObjCreate("ADODB.Connection")
    $adoCon.Open("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & $dbname & ";")
    $adoRs = ObjCreate("ADODB.Recordset")
    $adoRs.CursorType = 1
    $adoRs.LockType = 3
    $adoRs.Open($_sql, $adoCon)

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

    With $adoRs
    If .RecordCount Then
    While Not .EOF
    $_output = $_output & .Fields($_field).Value & @CRLF
    .MoveNext
    WEnd
    EndIf
    EndWith
    $adoCon.Close
    Return $_output
    EndFunc ;==>_ReadOneFld

    [/autoit]


    leider hab ich nicht das gefühl, dass ich es richtig mache.

    Das ist übrigends das erste mal, dass ich etwas mit Datenbanken zutun habe, und habe in der Materie wirklich keinen Plan =(