MySQL UDF von progandy

  • Ich bin ja immer noch am ausprobieren von AutoIt und habe mich auch schon an Datenbanken rangewagt. Das war aber SQlite und nun möchte ich es gerne mal mit MySQL versuchen. Eine Recherche im Forum hat ergeben, daß man am besten die UDF von progandy nehmen soll. Ok, gemacht und das beiliegende Test-Script funktioniert auch.
    Aber ich habe Probleme Daten selber auszugeben, weil ich die ganzen Funktionen und Parameter nicht kenne. Das ist leider nicht dokumentiert, zumindest hab ich nichts gefunden.
    So habe ich zwei Fragen: Zum ersten würde ich gerne wissen, wie man einen Datensatz ausgibt. Also 'select...' ohne 'Where'. Meines Wissens, wird dann der letzte Datensatz ausgegeben. Nur wie?
    Und zweitens wäre die Frage, wie ich das in einer WHILE-Schleife ausgeben kann. Dann natürlich alle Datensätze oder die mit Where gefilterten.
    Ich such mir hier schon die Augen kaputt, aber die meisten Bsp. berufen sich auf die mysql.au3 die nicht von prograndy ist. Aber die geht ja wohl nur über ODBC und wenn man es auch ohne könnte, wäre mir das schon lieber.
    Anbei mal noch mein Versuchsscript, was so nicht funkioniert. Eine kleine GUI mit einem Listview, in dem ich die Daten gerne hätte.

    [autoit]

    #include <array.au3>
    #include "MySQL.au3"

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

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 564, 276, -1, -1)
    $Button1 = GUICtrlCreateButton("Button1", 240, 235, 75, 25, $WS_GROUP)
    $ListView1 = GUICtrlCreateListView("Name|Vorname", 5, 5, 555, 215, -1, BitOR($WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES))
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 200)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 200)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    ; MYSQL starten, DLL im PATH (enthält auch @ScriptDir), sont Pfad zur DLL angeben. DLL muss libmysql.dll heißen.
    _MySQL_InitLibrary()
    If @error Then Exit MsgBox(0, '', "")

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

    $MysqlConn = _MySQL_Init()
    $connected = _MySQL_Real_Connect($MysqlConn, "localhost", "root", "", "test")
    If $connected = 0 Then Exit MsgBox(16, 'Connection Error', _MySQL_Error($MysqlConn))

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

    $query = "SELECT * FROM test"
    _MySQL_Real_Query($MysqlConn, $query)

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

    $res = _MySQL_Store_Result($MysqlConn)
    $fields = _MySQL_Num_Fields($res)
    $rows = _MySQL_Num_Rows($res)

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

    ; Zugriff 1
    Dim $array[$rows][$fields]
    For $k = 1 To $rows
    $mysqlrow = _MySQL_Fetch_Row($res,$fields)

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

    $lenthsStruct = _MySQL_Fetch_Lengths($res)

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

    For $i = 1 To $fields
    $length = DllStructGetData($lenthsStruct, 1, $i)
    $fieldPtr = DllStructGetData($mysqlrow, 1, $i)
    $data = DllStructGetData(DllStructCreate("char[" & $length & "]", $fieldPtr), 1)
    $array[$k - 1][$i - 1] = $data
    Next
    Next
    _ArrayDisplay($array)

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

    GUICtrlCreateListViewItem($array[0][1] & "|" & $array[0][2], $ListView1)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE, $Button1
    Exit

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

    EndSwitch
    WEnd

    [/autoit]

    Dann noch die kleine DB dazu:

    Bin für jeden Tipp dankbar!

  • Ohne Where wird die komplette Tabelle ausgegeben.
    Die Rückgabewerte der Funktionen sind die selben wie bei der MySQL C API
    ( bis auf FetchRowAsStringArray, FetchResultAsStringArray, die habe ich selbst gemacht und geben entweder einen Datensatz oder ein komplettes Ergenis als Array von Strings aus.)
    Solltest du eine einfachere Umsetzung wünschen, solltest du dir EzMySQL anschauen, das ist eine an SQLite.au3 angelehnte Modifikation meiner UDF: http://www.autoitscript.com/forum/topic/11…es-with-autoit/

    Edit: SQL musst du jedoch getrennt davon lernen, diese Syntax ist überall die selbst. Such dir im Internet einfach ein passendes Tutorial.

  • Ich würde es schon gerne mit deiner probieren. Aber ich komme noch nicht ganz mit der Syntax klar. Wenn ich zum Bsp.

    [autoit]

    $row = _MySQL_Fetch_Row($res)
    MsgBox(0,"",$row['name'])

    [/autoit]


    eingebe, dann passiert nichts. Mit PHP würde ich das aber so machen und mir würde die entsprechende Spalte ausgegeben werden. Wieso funktioniert das aber hier nicht? Wo muß ich umdenken?

    [autoit]

    $row = _MySQL_Fetch_Row($res)
    MsgBox(0,"",$row->name)

    [/autoit]


    Das geht auch nicht, weil es ja kein Objekt ist, sondern ein Array.

  • _MySQL_Fetch_Row gibt einen Pointer auf ein Array mit Pointern auf die Felder zurück.
    Die Werte direkt bekommst du über _MySQL_Fetch_Row_StringArray. Diese sind in der Reihenfolge wie im SQL-Befehl, können aber nur per index und nicht per Name angesprochen werden.

  • Ich hab eben diesen Thread entdeckt. Ich denke der hilft mir erstmal weiter, weil da ein ähnliches Problem vorhanden war.
    Dennoch danke erstmal. Ich dachte nur, daß dies in etwa so einfach wie mit PHP wäre, weil da hab ich es ja auch irgendwann mal so halbwegs kapiert. :)

  • Hi,

    Ich sagte doch, dass du EzMySQL verwenden sollst, wenn du es einfacher möchtest. Ich habe die C-API so ziemlich 1:1 umgesetzt, um alle Möglichkeiten offen zu halten, dadurch ist die UDF aber auch komplexer. EzMySQL ist dagegen mehr auf benutzerfreundlichkeit ausgelegt und sollte für die meisten Aufgaben ausreichen.