Datenbank

  • Hallo!

    Dies ist mein erster "Test" mit SQLite, und da es gut funktioniert, hab ich mir gedacht das ihr auch mit meinen erfolg feiern dürft^^
    Es ist eine telefon liste..

    viel spaß damit!

    Mfg Trallala

    Edit: ups ... wo sind meine daten hin ?!
    naja ich hänge sie einfach mal "wieder" mit ran.

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

    Opt("GUIOnEventMode", 0)
    #NoTrayIcon
    #include <GuiListView.au3>
    #include <GUIConstants.au3>
    #include "SQLite.au3"

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

    $datei1 = @ScriptDir & "\kontakte.db"
    $Form1 = GUICreate("Kontakte-Datenbank", 585, 420, 193, 115)
    $raus = GUICtrlCreateButton("Beenden",510, 17, 68, 20)
    $Tab1 = GUICtrlCreateTab(8, 16, 569, 321)
    ;
    ;--- Eingabe
    $TabSheet1 = GUICtrlCreateTabItem("Neue Eingabe")
    ;Vorname
    GUICtrlCreateLabel("Vorname:",16, 48, 80, 20)
    $i_namev = GUICtrlCreateInput("",100, 48, 130, 20)
    ;Nachname
    GUICtrlCreateLabel("Nachname:",16, 78, 80, 20)
    $i_namen = GUICtrlCreateInput("",100, 78, 130, 20)
    ;Telefon
    GUICtrlCreateLabel("Telefon:",16, 108, 80, 20)
    $i_tel = GUICtrlCreateInput("",100, 108, 130, 20)
    ;E-Mail
    GUICtrlCreateLabel("E-Mail:",16, 138, 80, 20)
    $i_email = GUICtrlCreateInput("",100, 138, 130, 20)
    $ok1 = GUICtrlCreateButton("Übernehmen",100, 168, 130, 20)
    ;
    ;--- Ausgabe
    $TabSheet2 = GUICtrlCreateTabItem("Ausgabe")
    $ListView1 = GUICtrlCreateListView("Nummer|Vorname|Nachname|Telefon|E-Mail", 16, 48, 553, 281)
    GUICtrlCreateLabel("Gesamt: ",290, 20, 50, 20)
    $gesamt = GUICtrlCreateLabel("",350, 20, 60, 20)
    ;
    ;--- Suche
    $TabSheet3 = GUICtrlCreateTabItem("Suche")
    $ListView2 = GUICtrlCreateListView("Nummer|Vorname|Nachname|Telefon|E-Mail", 16, 48, 553, 281,BitOR($LVS_EX_GRIDLINES,$LVS_EX_GRIDLINES))
    GUICtrlCreateLabel("Suche nach: ",8, 350, 100, 20)
    $was = GUICtrlCreateCombo ("Vorname", 110,345,80)
    GUICtrlSetData($was,"Nachname|Telefon|E-Mail")
    $s_input = GUICtrlCreateInput("",200, 345, 300, 20)
    GUICtrlCreateLabel("Gefunden: ",290, 20, 50, 20)
    $gefunden = GUICtrlCreateLabel("",350, 20, 60, 20)
    $ok2 = GUICtrlCreateButton("Suchen",510, 345, 65, 20)
    ;
    ;--- Löche Eintrag
    GUICtrlCreateLabel("Lösche Daten mit der Nummer: ",8, 380, 190, 20)
    $l_input = GUICtrlCreateInput("",200, 375, 300, 20)
    $ok3 = GUICtrlCreateButton("Löschen",510, 375, 65, 20)
    GUICtrlSetState ($ok3, $GUI_DISABLE )
    GUISetState(@SW_SHOW)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Tab1
    If GUICtrlread($Tab1) = 1 Then Ausgabe()
    Case $ok1
    Eingabe()
    Case $ok2
    If GUICtrlRead($was) = "Vorname" Then
    $col = "namev"
    EndIf
    If GUICtrlRead($was) = "Nachname" Then
    $col = "namen"
    EndIf
    If GUICtrlRead($was) = "Telefon" Then
    $col = "tel"
    EndIf
    If GUICtrlRead($was) = "E-Mail" Then
    $col = "email"
    EndIf
    suchen()
    GUICtrlSetState ($ok3, $GUI_ENABLE )
    case $ok3
    Loeschen()
    Case $raus
    Exit
    EndSwitch
    WEnd
    ;
    ;--- Eingabe (neue Daten speichern)
    Func Eingabe()
    If GUICtrlRead($i_namev) <> "" Or GUICtrlRead($i_namen) <> "" Then
    _DoSQL("INSERT INTO Kontakte (id, namev, namen, tel, email) VALUES (NULL, '" & GUICtrlRead($i_namev) & "', '" & GUICtrlRead($i_namen) & "', '" & GUICtrlRead($i_tel) & "', '" & GUICtrlRead($i_email) & "');", $datei1)
    Else
    MsgBox(64,"","Ohne Vor- oder Nachname macht" & @CRLF & "der Eintrag keinen Sinn!")
    EndIf
    EndFunc
    ;
    ;--- Ausgabe
    Func Ausgabe()
    _GUICtrlListViewDeleteAllItems($ListView1)
    Local $kontakte1
    $kontakte1 = _DoSQL("SELECT * FROM Kontakte;", $datei1)
    For $i = 1 To $kontakte1[0][0]
    $inhalt1 = $i & "|" & $kontakte1[$i][1] & "|" & $kontakte1[$i][2] & "|" & $kontakte1[$i][3] & "|" & $kontakte1[$i][4]
    GUICtrlCreateListViewItem($inhalt1, $ListView1)
    Next
    GUICtrlSetData($gesamt,$i -1)
    EndFunc
    ;
    ;--- Suche
    Func Suchen()
    _GUICtrlListViewDeleteAllItems($ListView2)
    $kontakte2 = _DoSQL("SELECT * FROM Kontakte WHERE `" & $col & "` LIKE '%" & GUICtrlRead($s_input) & "%';", $datei1)
    For $i = 1 To $kontakte2[0][0]
    $inhalt2 = $kontakte2[$i][0] & "|" & $kontakte2[$i][1] & "|" & $kontakte2[$i][2] & "|" & $kontakte2[$i][3] & "|" & $kontakte2[$i][4]
    GUICtrlCreateListViewItem($inhalt2, $ListView2)
    Next
    GUICtrlSetData($gefunden,$i -1)
    If $i -1 < 1 then GUICtrlSetState ($ok3, $GUI_DISABLE )
    EndFunc
    ;
    Func Loeschen()
    If GUICtrlRead($l_input) <> "" Then
    If MsgBox(8192+4, "Löschen?", "Soll der Datensatz mit der Nummer " & GUICtrlRead($l_input) & " wirklich gelöscht werden?") = 6 Then _DoSQL("DELETE FROM Kontakte WHERE `id`='" & GUICtrlRead($l_input) & "';",$datei1)
    EndIf
    suchen()
    EndFunc
    ;
    ;-- Neue Datenbank (data1.db)
    Func Neu()
    _DoSQL("CREATE TABLE Kontakte (id INTEGER PRIMARY KEY, namev varchar(20),namen varchar(20), tel varchar(20), email varchar(20));", $datei1)
    EndFunc
    ;
    ; peethebee (Danke an jonk!)
    Func _DoSQL($_SQL_Code, $cal_filename)
    Dim $ret_array[250][15]
    ; Datenbank initialisieren und öffnen
    _SQLite_Startup (@ScriptDir & "\sqlite3.dll")
    If @error > 0 Then
    MsgBoX(0, "Meldung", "SQLite-DLL konnte nicht geladen werden")
    Return 0
    EndIf
    ; hier kann man einen Standardpfad festlegen
    $dbname = $cal_filename
    _sqLiTe_opEn ($dbname)
    If @error > 0 Then
    MsgBoX(0, "Meldung", $dbname & " konnte nicht geöffnet werden (Rechte?, Datei in Benutzung?)")
    Return 0
    EndIf
    Dim $hQuery, $aRow
    $iTmp = _SQlite_Query (-1, $_SQL_Code, $hQuery)
    If Not $iTmp = $SQLITE_OK Then
    MsgBoX(0, "Meldung", "SQLite-Befehl verursachte einen Fehler: " & $_SQL_Code)
    EndIf
    $num_results = 0
    While _SQLite_FetchData ($hQuery, $aRow) = $SQLITE_OK
    $num_results += 1
    ; Daten in Array kippen und dann zurückgeben (noch nicht getestet)
    For $i = 0 To UBound($aRow) - 1
    $ret_array[$num_results][$i] = $aRow[$i]
    Next
    WEnd
    ; Länge des Ergebnisses erfassen, Ergebnisse ab $ret_array[1]
    $ret_array[0][0] = $num_results
    $ret_array[0][1] = UBound($aRow)
    $iTmp = _SQLite_Close ()
    If Not $iTmp = $SQLITE_OK Then
    MsgBoX(0, "Meldung", "Datenbank konnte nicht geschlossen werden.")
    MsgBoX(0, "Meldung", "SQLite ErrCode: " & $iTmp)
    MsgBoX(0, "Meldung", "SQLite ErrMsg: " & _SQLite_ErrMsg ())
    Return 0
    EndIf
    _SQLite_Shutdown ()
    Return $ret_array
    EndFunc ;==>_DoSQL

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

    8 Mal editiert, zuletzt von trallala (9. Juli 2007 um 23:35)

    • Offizieller Beitrag

    Ja, mit SQLite ist das eigentlich eine gute Chance. SQL als Verbindungssprache ist bei einfachen Sachen recht einfach, dennoch sind sehr detaillierte Abfragen möglich. Da alles in C realisert ist, ist es pfeilschnell und damit die optimale Alternative zu purem AutoIt bei größeren Datenmengen.
    Zusammen mit jonk habe ich eine Funktion _DoSQL geschrieben, der man nur noch die entsprechende SQL-Zeile übergeben muss. Dann bekommt man ein Array mit den Suchergebnissen zurück. Diese Funktion ist auch oben verwendet.

    Also, pack es an!

    peethebee

  • Hi Leute,

    heute habe ich noch ein wenig an der "Kontaktliste" gearbeitet:
    Hinzugekommen ist etwas Farbe und eine leichte Verschlüsselung
    (verwendet "_StringEncrypt" zum schreiben und lesen der Einträge)

    Edit: jetzt habe ich noch den "VACUUM"-Befehl mit bei, der bei verlassen des Programm's dafür sorgt das "Löschktionen" nicht mehr als "Markiert gelöscht" in der Datenbank zurück bleiben sondern entsprechend bereinig werden.


    Mfg
    Trallala

    4 Mal editiert, zuletzt von trallala (4. September 2006 um 01:49)

    • Offizieller Beitrag

    Hallo!

    Wer sich intensiver mit SQLite beschäftigen will findet hier links zu ein paar hilfreichen Tools:

    Aktuelle Version von SQLite, DLL und Analyzer
    http://www.sqlite.org/download.html

    SQLiteAdministrator
    http://sqliteadmin.orbmu2k.de/

    SQLite Database Browser
    http://sqlitebrowser.sourceforge.net/index.html

  • Hi,

    @DJMANU: Im Grunde kann man aus dem "Kontakte"-Projekt basteln was auch immer das Herz begehrt. Ich denke mal, das "dies" eine gute Basis darstellt für eine Adressverwaltung, Videoverwaltung oder was auch immer ...

    Mfg
    Trallala

    Einmal editiert, zuletzt von trallala (22. August 2006 um 18:19)

  • Benutzer »trallala« möchte/kann keine privaten Nachrichten empfangen.

    Wieso denn das? Wollte mal eine persönliche Anmerkung machen. Geht das irgendwie?

  • Zitat

    Benutzer »trallala« möchte/kann keine privaten Nachrichten empfangen.

    o.k. - dann mach mal (die funktion hatte ich vorübergegend abgeschalten)

    mfg
    trallala

  • hi,

    danke th.mega, ups: sorry - ich meinte natürlich Xenobiologist

    ich habe noch dazu die "sqlite.au3" auswechseln müßen, jetz sind keine fehler mehr und die daten werden wie erwartet wieder angezeigt wie sie sollen.

    mfg
    trallala