Access (.accdb) Datenbank auslesen etc.

  • Hallo MadCatz,

    1. bitte alle Leerzeichen aus den Datenbanknamen, Tabellennamen, Spaltenüberschriften entfernen!
    2. Umlaute gehören da auch nicht rein ü, ä, ö usw ... :)

    Teste mal deine Abfrage mit MS Access ... Im SQL Modus ...

    Erstelle mal eine Access DB nach meinem Beispiel, mit den paar feldern und teste mal den geposteten Code ...

    Gruß gmmg ;)

  • Guten Morgen =)

    Also ich hab mir mal eine kleine Datenbank selbst erstellt, wie gmmg es mir empfohlen hat (s. Anhang).

    Quellcode:

    [autoit]

    $datenbankpfad = "C:\Users\michflos\Desktop\Test.accdb"
    $tabellenname = "Tabellentest"
    $Spalte1 = "Stick" ;nicht ID Spalte
    $Spalte2 = "Box" ;nicht ID Spalte

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

    $query = "SELECT + FROM "&$tabellenname&" Where Box = '23'"
    $strData1 = _ReadOneFld($query, $datenbankpfad,$Spalte1)

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

    ConsoleWrite($query& @CRLF &$strData1)
    MsgBox(0,"",$query & @CRLF & "Ergebnis: " & $strData1)

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

    Func _ReadOneFld($_sql, $_datenbankpfad, $_field)
    Dim $_output
    $adoCon = ObjCreate("ADODB.Connection")
    $adoCon.Open("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & $datenbankpfad & ";")
    $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

    [/autoit]

    So wenn ich das kleine Tools starte öffnet sich die MsgBox. Hier wird allerdings nicht das angezeigt, was hinter "Ergebnis: " stehen soll ($strData1).


    Kommt es mir nur so vor oder sind Datenbanken echt heftig? (Zumindest diese in ein Programm einzubinden).


    Ich brauch mal eine Meinung von euch?

    Meint ihr ich krieg das hin, dass ich die Datenbank, eine Tabelle darin öffne und anschließend nach einer Spalte suche und diese dann mit dem eintrag in einem Inputfeld abgleiche?
    Wenn nicht kann ich das Projekt stoppen.


    Viele Grüße,
    MadCatz =)

  • Hallo MadCatz :)

    deine Abfrage (Select + From ...) ist falsch, zumindest hier in deinem angegeben Quelltext!
    Muss heißen Select * From ....

    Gruß gmmg ;)

  • Also bei mir funktioniert das!

    hast du mal im access selbst die SQL Abfrage gemacht? (siehe Bild)

    [autoit]


    $datenbankpfad = "d:\Test.accdb"
    $tabellenname = "Tabellentest"
    $Spalte1 = "Stick" ;nicht ID Spalte
    $Spalte2 = "Box" ;nicht ID Spalte

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

    $query = "SELECT * FROM " & $tabellenname & " WHERE Box = '22'"
    $strData1 = _ReadOneFld($query, $datenbankpfad,$Spalte1)

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

    ConsoleWrite($query& @CRLF &$strData1)
    MsgBox(0,"",$query & @CRLF & "Ergebnis: " & $strData1)

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

    Func _ReadOneFld($_sql, $_datenbankpfad, $_field)
    Dim $_output
    $adoCon = ObjCreate("ADODB.Connection")
    $adoCon.Open("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & $datenbankpfad & ";")
    $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

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

    gruß gmmg

  • So ich hab jetzt mal den Fehler mit MsgBoxen eingrentzen können.

    Der Fehler liegt hier drin, er springt nicht in das If:

    [autoit]

    If .RecordCount Then
    MsgBox(0,"5","Test")
    While Not .EOF
    $_output = $_output & .Fields($_field).Value & @CRLF
    MsgBox(0,"6",$_output)
    .MoveNext
    WEnd

    [/autoit]


    Ganzer Quellcode:


    [autoit]

    $datenbankpfad = @ScriptDir&"\Test.accdb"
    $tabellenname = "Tabellentest"
    $Spalte1 = "Stick" ;nicht ID Spalte
    $Spalte2 = "Box" ;nicht ID Spalte

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

    $query = "SELECT * FROM " & $tabellenname & " WHERE Box = '14'"
    $strData1 = _ReadOneFld($query, $datenbankpfad, $Spalte1)

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

    ConsoleWrite($query& @CRLF &$strData1)
    MsgBox(0,"",$query & @CRLF & "Ergebnis: " & $strData1)

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

    Func _ReadOneFld($_sql, $_datenbankpfad, $_field)
    Dim $_output
    $adoCon = ObjCreate("ADODB.Connection")
    $adoCon.Open("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & $datenbankpfad & ";")
    $adoRs = ObjCreate("ADODB.Recordset")
    $adoRs.CursorType = 1
    $adoRs.LockType = 3
    $adoRs.Open($_sql, $adoCon)
    MsgBox(0,"0",$_datenbankpfad)
    MsgBox(0,"1",$_field)
    MsgBox(0,"2",$_sql)
    MsgBox(0,"3",$_output)
    With $adoRs
    MsgBox(0,"4","Test")
    If .RecordCount Then
    MsgBox(0,"5","Test")
    While Not .EOF
    $_output = $_output & .Fields($_field).Value & @CRLF
    MsgBox(0,"6",$_output)
    .MoveNext
    WEnd
    Else
    MsgBox(0,"7","Fehler")
    EndIf
    EndWith
    $adoCon.Close
    Return $_output
    EndFunc

    [/autoit]


    Vielleicht kann mir jetzt jemand genauer bei meinem Problem behilflich sein.

  • hallo MadCatz ...

    auch mit der au3 und test datenbank von mir bekommst du den fehler?

    entferne mal das "@crlf" bei "$_output = $_output & .Fields($_field).Value @crlf"

    [autoit]


    $_output = $_output & .Fields($_field).Value

    [/autoit]

    leerzeichen hast du hoffentlich nicht in den feldwerten ... kommt ja manchmal beim kopieren und einfügen vor ...
    ansonsten, würde ich nochmal aud der Test.accdb eine Test.mdb machen und den code wie folgt ändern

    [autoit]


    $adoCon.Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & $_dbname)

    [/autoit]

    gruß gmmg

  • Hey gmmg, ja den Fehler erhalte ich auch wenn ich deine erstellte au3 mit SciTE öffne und mit F5 starte. Wenn ich deine erstellte exe starte erhalte ich keinen Fehler.

    Ich kann leider die Datenbank nicht in mdb umwandeln, da dies nicht gewünscht ist.
    Ich hab jetzt herrausbekommen, dass der Fehler wohl an dem If..... .RecordCount liegt.
    Wie ich das Umgehen kann weis ich noch nicht.

    Jedenfalls werde ich deinen Tipp nochmal ausprobieren.
    Leerzeichen habe ich zu 99% nicht drin. ich werde es aber nochmal überprüfen.

    :)

  • MadCatz: ich habe dein post aus #33 genommen und mir ne Test.accdb mit Werten erstellt

    bei mir funzt das Teil ohne Probs..

    Einmal editiert, zuletzt von Torni (5. Mai 2014 um 17:49) aus folgendem Grund: bei mir heißt die Tabelle "Tabelle1"

  • gmmg

    ich habe die Autoit-Version 3.3.10.2 und SciTE Version 3.4.1


    Torni

    dann kann ja eigentlich nur etwas mit meiner Tabelle nicht stimmen, bzw. mit meinem Access 2007


    PS: Mit gmmg's Datenbank und Script aus der PN habe ich das gleiche Problem vor mir :(


    Edit:

    Kann es sein, dass der Fehler daran liegt, das die ID, in meiner Datenbank, bei 2 anfängt und nicht bei 1, wie auf dem Bild von TORNI zusehen ist ?!?

  • ok ...

    wenn das script bei anderen auch geht, ist das schon seltsam!
    hast du das mal an einem anderen client getestet?

    mit der ID in der Datenbank hat das eigentlich nichts zu tun! Könntest aber die DB mal bearbeiten und die Splate ID entfernen ...
    und bei dir geht das auch nicht, wenn du eine exe aus deinem script erstellst und diese dann startest?

    gruß gmmg :)