Sqlite

    • VB.NET

    Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Thias.

      Hi, Ich hab für mein Programm nach einer simplen Datenbank gesucht. Wofür man keine "Overkill" Datenbank braucht die 50mb hat und einen Server.
      Sqlite kannte ich schon früher und hab direkt danach gegoogled.
      Hier eine kleine Einführung:
      Also. Sqllite ist eine Datenbank, die in einer einzigen Datei gespeichert wird. Jedoch fast genauso gehandhabt wird wie Mysql.
      Ich arbeite mit: sqlite.org/
      Der Anfang:
      Man kann eine Sqllite datenbank so erstellen:

      VB.NET-Quellcode

      1. Dim connect As New SQLite.SQLiteConnection()
      2. connect.ConnectionString = "Data Source=user.s3db;"
      3. connect.Open()
      4. connect.Close()

      Det' war's.
      Ihr solltet nun eine "user.s3db" in eurem debugordner finden.
      Datenbank befüllen
      Eine Datenbank ohne einträge oder Tabellen hat natürlich keinen Sinn... also erstellen wir mal eine Tabelle.
      Denkt daran das die obere Connection der "Dateierstellung" in der gleichen sub sein muss.
      Für jeden Query der erstellt wird, wird eine Connection benötigt!

      VB.NET-Quellcode

      1. Dim connect As New SQLite.SQLiteConnection()
      2. Dim command as SQLiteCommand
      3. connect.ConnectionString = "Data Source=user.s3db;"
      4. connect.Open()
      5. connect.Close()
      6. connect.Open()
      7. command = connect.CreateCommand
      8. command.CommandText = "CREATE TABLE user(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT);" 'Die Query
      9. command.ExecuteNonQuery() ' Die Query wird ausgeführt
      10. command.Dispose()
      11. connect.Close() 'Schließen

      Wir haben eine Tabelle erstellt mit namen "user", und den Spalten id(Auto Increment) und name.
      Benutzen:

      Eine Datenbank will man natürlich benutzen.
      Hier mal ein paar Codebeispiele:
      Eintragen:

      VB.NET-Quellcode

      1. command.CommandText = "INSERT INTO user (name) VALUES ('Tsuyo')"

      Jetzt kommt der Gag: id muss nicht hochgezählt werden da es Auto Increment beinhaltet :> also spart man sich schonmal einen Eintrag.
      Die Prozedur ist wie bei der Create Table Query das gleiche...

      Löschen:

      VB.NET-Quellcode

      1. command.CommandText = "DELETE FROM user WHERE id ='1' "

      Sollte selbsterklärend sein.

      Ausgabe:
      In der Ausgabe, also "SELECT" muss eine Whileschleife benutzt werden um an alle daten ranzukommen. Ausserdem ist der Ablauf etwas anders.

      VB.NET-Quellcode

      1. command.CommandText = "SELECT id,user FROM user"

      Bis hier ist es noch das gleiche.

      VB.NET-Quellcode

      1. command.ExecuteNonQuery()
      Entfällt und wird mit:

      VB.NET-Quellcode

      1. Dim SQLreader As SQLiteDataReader = command.ExecuteReader()

      ersetzt.
      Ab jetzt wird in der while schleife gearbeitet:

      VB.NET-Quellcode

      1. While SQLreader.Read()
      2. 'Man ruft die einträge mit sqlreader(zahl) aus... zahl steht für die jeweilige tabellenspalte. Also sqlreader(0) gibt id aus, sqlreader(1) gibt den namen aus.
      3. messagebox.show("Der Benutzer: " & sqlreader(1) & " hat die ID: " & sqlreader(0))
      4. End While

      Am ende

      VB.NET-Quellcode

      1. command.Dispose()
      2. connection.Close()

      Nicht vergessen :)

      Schönen tag noch!

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Marcus Gräfe“ ()

      Zu SQLite sollte noch gesagt werden, das man für x64 eine andere dll benutzen muss, als für x86 Systeme.
      Das geht aus dem Link oben nicht so ganz hervor.
      wintoolz.de
      • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
      • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
      • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

      Benutze auch du Ecosia
      Aha. Wäre mir neu.
      Würde mich aber intresieren, ob das so ist. Vielleicht weis jemand mehr darüber.
      wintoolz.de
      • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
      • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
      • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

      Benutze auch du Ecosia
      Hallo Tsuyo,

      vielen Dank für Deinen kurzen und verständlichen Einblick in SQLite.
      Bei mir hat es nach einigen Einstellungen auch fast gleich funktioniert (beim Erstellen auf "Any" und Framework 3.5 stellen und schon gings).

      Eine Anmerkung/Frage habe ich jedoch:
      1. müsste die SELECT-Anweisung nicht

      VB.NET-Quellcode

      1. command.CommandText = "SELECT id,name FROM user"
      lauten? Die angebebene DB "Kunden" gibt es im Tutorial nicht.
      2. die Verknüpfung bei der Ausgabe der MessageBox müssten doch eigentlich mit & anstatt mit + verbunden sein, oder?
      3. gibt es eine Möglichkeit die Tabelle in einem Designer anzeigen zu lassen oder zu bearbeiten?? Oder gar mit einem DataGridView?

      Vielen Dank für die klasse Arbeit die Du hier gemacht hast!

      T1g0r schrieb:

      Zu SQLite sollte noch gesagt werden, das man für x64 eine andere dll benutzen muss, als für x86 Systeme.
      Das geht aus dem Link oben nicht so ganz hervor.
      Nein muss man nicht, ich progge atm. auch an einem Projekt das eine SQL-Lite DB hat und die DLL funktioniert einwandfrei auf XP, Vista, W7-x86 und W7-x64..darauf habe ich meine Software bisher ohne Probleme getestet, einziger Faktor ist, die DLL läuft nicht mit .NET4.
      : NV Updater | Nvidia Driver Update Tool
      Du kannst die Tabelle ganz normal in ein DataGridView laden. Für SQLite gibts aber auch den SQLite Database Browser oder ein Firefox-Addon zur grafischen Verwaltung der Datenbank.

      Chars und Strings werden in VB mit dem &-Operator verbunden oder mit

      VB.NET-Quellcode

      1. String.Concat()
      Hey, danke für deine Rückmeldung.

      Du hast recht, Strings sollte man immer mit & verketten. Zu der Zeit war ich nicht wirklich in VB.NET drin, und hab mehr meine Kenntnisse aufgeschrieben.
      Die SELECT Anweisung müsste dann natürlich auch geändert werden. Ich änder das natürlich gleich.

      Eine Tabelle im Designer bearbeiten ist nicht möglich, jedenfalls ist mir kein Weg bekannt. Es gibt aber kleine Tools die SQLite Datenbanken beschreiben können.
      Mein Favorit ist dieser: sqliteadmin.orbmu2k.de/

      TTX.exe schrieb:

      Nein muss man nicht, ich progge atm. auch an einem Projekt das eine SQL-Lite DB hat und die DLL funktioniert einwandfrei auf XP, Vista, W7-x86 und W7-x64..darauf habe ich meine Software bisher ohne Probleme getestet, einziger Faktor ist, die DLL läuft nicht mit .NET4.
      Ersteinmal sei gesagt: es ist völlig gleich, ob die DLL auf XP, Vista oder 7 benutzt wird (außer, es steht explizit dabei, ist hier aber nich der Fall). Das, was zählt, ist die Prozessorarchitektur. x86 oder x64 mehr nicht.
      Bei HolzShots gab es wegen der SQLite-Anbindung viele Bugreports von x64-Benutzern. Ich selber habe zwar auch ein x64-System, habe den Fehler aber nicht bekommen, weil ich beide Assemblies registriert habe (x86 und x64). Eine Lösung des Problems wäre, das Hostprogramm nur für x86 zu kompilieren. Dadurch kann das x64-System noch das x86-Subsystem benutzen.
      Eine andere Lösung wäre es, 2 seperat kompilierte Assemblies herauszubringen. Eine Lösung mit AnyCPU ist mir nicht bekannt, kann aber existieren.

      Wenn man das Ganze umgehen will, kann man auch MS Access Databases nehmen.

      ING schrieb:

      Die dll wird doch vom Framework bereitgestellt, oder? und wenn das installiert ist, dann musst du doch keine dll mehr mitgeben...
      Nein, SQLite ist nicht im Framework implementiert. Da SQLite nicht von Microsoft ist, wird das auch wohl nie der Fall sein. Allerdings sind MS Access Databases im Framework intigriert. Diese sind ebenfalls Dateibasiert, nur von Microsoft.
      Mehr dazu hier: devcity.net/Articles/215/1/article.aspx und hier: msdn.microsoft.com/en-us/libra….data.oledb(v=vs.71).aspx
      Von meinem iPhone gesendet
      Hallo Tsuyo,

      bin seit ein paar Stunden dabei mich mit Visual Basic 2010 zu beschäftigen und dabei auf Deinen Bericht gestoßen. Ich würde Dir dazu gerne Fragen stellen.
      Die System.Data.SQLite.dll hab ich als Verweiß hinzugefügt. Eine Form angelegt und Deinen Code nach Public Class Form1 eingefügt.

      In der Fehlerliste, werden mir 3 Fehler angezeigt, die eine Deklaration erwarten für das connect in Deinen Zeilen. Könntest du mir vieleicht weiterhelfen was noch fehlt?

      Gruß
      Rudolf

      Ergänzung zum SQLite Tutorial - Projekt mit DbProviderFactory: Auswahl zwischen SQLite und SqlCe beim Start

      Leider habe ich bislang kein Beispiel-Projekt in diesem Tutorial entdeckt.

      Von daher habe ich ein Projekt vom ErfinderDesRades und VBDev, welches SqlCe einsetzt, von diesem Post: BindingSource an 2. Form übergeben umgeschrieben.

      Dabei wird der DbProviderFactory eingesetzt - die DbProviderFactory-Klasse ermöglicht die Benutzung unterschiedlicher Datenbanken mit einem variablen Connection-String über einen DbDataAdapter.

      Dadurch kann nun am Anfang des Programmes per Auswahl entschieden werden, ob mit der SQLite-Datenbank oder der SqlCe-Datenbank gearbeitet werden soll.



      Spoiler anzeigen

      VB.NET-Quellcode

      1. Public Class frmchoice
      2. Private SQLiteorSqlCe As String = "SQLite"
      3. Private Sub CheckBox1_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles CheckBox1.CheckedChanged
      4. If CheckBox1.CheckState = CheckState.Checked Then
      5. CheckBox2.CheckState = CheckState.Unchecked
      6. SQLiteorSqlCe = "SQLite"
      7. End If
      8. End Sub
      9. Private Sub CheckBox2_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles CheckBox2.CheckedChanged
      10. If CheckBox2.CheckState = CheckState.Checked Then
      11. CheckBox1.CheckState = CheckState.Unchecked
      12. SQLiteorSqlCe = "SqlCe"
      13. End If
      14. End Sub
      15. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
      16. Me.Hide()
      17. Dim frmmain As New mainform(SQLiteorSqlCe)
      18. frmmain.ShowDialog()
      19. Me.Close()
      20. End Sub
      21. Private Sub frmchoice_Load(sender As Object, e As System.EventArgs) Handles Me.Load
      22. CheckBox1.CheckState = CheckState.Checked
      23. End Sub
      24. End Class

      Als erstes wird nun in "mainform" die Sub "New" aufgerufen:

      Spoiler anzeigen

      VB.NET-Quellcode

      1. Private DbcdarchivAdapter As DbDataAdapter
      2. Private SQLiteOrSqlCe As String
      3. Public Sub New(ByVal DBChoice As String)
      4. InitializeComponent()
      5. SQLiteOrSqlCe = DBChoice
      6. End Sub

      Dann wurden der TableAdapter aus dem DataSet und den beiden Formen des Urprung-Programmes rausgeschmissen, da der TableAdapter fest verdrahtet mit der SqlCe-Datenbank war.

      Dafür steht nun ein wenig mehr Code in der Routine "ReLoad", welche ja auch von "mainform_Load" aufgerufen wird.

      Spoiler anzeigen

      VB.NET-Quellcode

      1. Private Sub ReLoad()
      2. Dim DBZugriff As New DbZugriff
      3. Dim ConStr As String = ""
      4. Dim ProviderName As String = ""
      5. Dim CmdStr As String = "SELECT [Interpret], [Album], [Genre], [Jahr], [Nummer] FROM [cdarchiv]"
      6. Select Case SQLiteOrSqlCe
      7. Case "SqlCe"
      8. ConStr = "Data Source=|DataDirectory|\cdarchiv_db.sdf"
      9. ProviderName = "System.Data.SqlServerCe.3.5"
      10. Case Else ' also auch Choice "SQLite"
      11. ConStr = "Data Source=|DataDirectory|\cdarchiv.s3db"
      12. ProviderName = "System.Data.SQLite"
      13. End Select
      14. Cdarchiv_dbDataSet3.cdarchiv.Clear()
      15. DbcdarchivAdapter = DBZugriff.DBZugriff(ProviderName, ConStr, CmdStr)
      16. If DbcdarchivAdapter IsNot Nothing Then
      17. DbcdarchivAdapter.Fill(Cdarchiv_dbDataSet3.cdarchiv)
      18. End If
      19. End Sub

      Erklärung zu "ReLoad"

      Die Klasse DbZugriff stellt uns den DbDataAdapter bereit - zu dieser Klasse später mehr.

      Der CommandText ""SELECT [Interpret], [Album], [Genre], [Jahr], [Nummer] FROM [cdarchiv]" ist für beide Datenbanken gleich!

      Je nach Auswahl in der form "frrmchoice" wird dann der Connectionstring und der ProviderName der entsprechenden Datenbank gesetzt.

      Danach wird über die Klasse DbZugriff der DbDataAdaper - der alle wichtigen Zugriffsinformationen auf die Tabelle "cdarchiv" (wie z.B. auch InsertCommand, UpdateCommand und DeleteCommand) enthält erstellt :

      VB.NET-Quellcode

      1. DbcdarchivAdapter = DBZugriff.DBZugriff(ProviderName, ConStr, CmdStr)

      Sofern dies erfolgreich war, werd dann die Daten in die Tabelle "cdarchiv" mit folgendem Befehl gelesen:

      VB.NET-Quellcode

      1. DbcdarchivAdapter.Fill(Cdarchiv_dbDataSet3.cdarchiv)

      In der Speicher-Sub "ÄnderungenSpeichernToolStripMenuItem_Click" wird nun logischerweise nicht mehr der TableAdapter sondern wieder der DbDataAdapter angesprochen:

      VB.NET-Quellcode

      1. Me.DbcdarchivAdapter.Update(Me.Cdarchiv_dbDataSet3.cdarchiv)

      Und schon sind die Daten gespeichert - also upgedatet, hinzugefügt oder gelöscht.

      Um mit DoppelClick einen Datensatz zur Bearbeitung aufzurufen, habe ich folgendes hinzugefügt:

      Spoiler anzeigen

      VB.NET-Quellcode

      1. Private Sub DataGridView1_CellContentDoubleClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentDoubleClick
      2. Dim obj As ToolStripMenuItem = CDBearbeitenToolStripMenuItem
      3. CDBearbeitenToolStripMenuItem_Click(obj, e)
      4. End Sub


      Wichtig war beim Code für die Form "frmDetail" folgenden Code hinzuzufügen, damit beim Beenden des Programmes auf Änderungen in der Tabelle geprüft werden kann:

      VB.NET-Quellcode

      1. Private Sub btOk_Click(sender As System.Object, e As System.EventArgs) Handles btOk.Click
      2. Me.Validate()
      3. Me.CdarchivBindingSource.EndEdit()
      4. End Sub


      Zum Schluss - wie versprochen - noch ein paar Worte zur Klasse DbZugriff - oder CreateDbDataAdapter - wie man diese auch nennen könnte:

      Spoiler anzeigen

      VB.NET-Quellcode

      1. Imports System.Data.Common
      2. Class DbZugriff
      3. Public Function DBZugriff(ByVal DBProviderName As String, ByVal DBConString As String, ByVal CmdStr As String) As DbDataAdapter
      4. Try
      5. Dim Factory As DbProviderFactory = DbProviderFactories.GetFactory(DBProviderName)
      6. Dim Cmd As DbCommand = Factory.CreateCommand
      7. Dim Conn As DbConnection = Factory.CreateConnection
      8. Dim Build As DbCommandBuilder = Factory.CreateCommandBuilder
      9. Dim Adapter As DbDataAdapter = Factory.CreateDataAdapter
      10. Conn.ConnectionString = DBConString
      11. Cmd.CommandText = CmdStr
      12. Try
      13. Cmd.CommandTimeout = 30 ' SQLCe mag nur 0!
      14. Catch
      15. End Try
      16. Cmd.Connection = Conn
      17. Cmd.Transaction = Nothing
      18. Adapter.SelectCommand = Cmd
      19. Adapter.AcceptChangesDuringFill = True
      20. Build.ConflictOption = ConflictOption.CompareRowVersion
      21. Build.SetAllValues = False
      22. Build.DataAdapter = Adapter
      23. Adapter.UpdateCommand = Build.GetUpdateCommand()
      24. Adapter.InsertCommand = Build.GetInsertCommand()
      25. Adapter.DeleteCommand = Build.GetDeleteCommand()
      26. Return Adapter
      27. Catch ex As Exception
      28. MsgBox(ex.Message)
      29. End Try
      30. Return Nothing
      31. End Function
      32. End Class

      An die Klasse DbZugriff wird als erster Parameter der ProviderName übergeben - bei SQLite also "Syste.Data.SQLite", zudem dann der ConnectionString und als letztes noch der Select-Command (in diesem Beispiel ohne where-Bedingung und anderen Möglichkeiten.)

      Mit

      VB.NET-Quellcode

      1. DbProviderFactories.GetFactory(DBProviderName)
      wird festgestellt und festgelegt um was für eine Datenbank es sich handelt - also entweder SQLite oder SqlCe.

      Dementsprechend wird dann daraus der DbCommand, die DbConnection, der DbCommandBuilder und der DbDataAdapter generiert - für jede x-beliebige Datenbank und Tabelle!

      Bei den Verweisen wurde natürlich der Verweis auf System.Data.SQLite hinzugefügt - die DLL "System.Data.SQLite.dll" wird in der Zip-Datei des Projektes mit ausgeliefert!

      Projekt runterladen, ausprobieren und Detail-Fragen bitte stellen - es ist unmöglich hier jetzt auf alles einzugehen.

      Getestet mit VB 2010 und VB 2013

      Ergänzender Nachtrag:

      Damit

      VB.NET-Quellcode

      1. Dim Factory As DbProviderFactory = DbProviderFactories.GetFactory(DBProviderName)

      für SQLite funktioniert, musste ich folgendes in die app.config einfügen:

      Spoiler anzeigen

      XML-Quellcode

      1. <!-- gefunden bei: http://system.data.sqlite.org/index.html/artifact/96f3932f9f371cca ansonsten findet VB den Provider nicht über GetFactory -->
      2. <system.data>
      3. <DbProviderFactories>
      4. <remove invariant="System.Data.SQLite"/>
      5. <add name="SQLite Data Provider" invariant="System.Data.SQLite"
      6. description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
      7. </DbProviderFactories>
      8. </system.data>


      Nachtrag 2:

      So nun ist die angekündigte abgeänderte / verbesserte Version verfügbar!

      Kein Bug mehr beim AutoIncremet, wenn Sätze erst hinzugefügt, dann teilweise gelöscht, gespeichert und dann geändert werden und wiederum gespeichert - Dank @ErfinderDesRades für den Hinweis.
      In Version 1.4 habe ich dazu das AutoIncrement in der Datenbankdatei bei der Tabelle "cdarchiv" entfernt!
      Jetzt zählt die ID bzw. in diesem Fall die "Nummer" nur noch das Programm hoch.

      Was dem Programm fehlt sind Abfragen, ob mehre Benutzer gleichzeitig einen Datensatz bearbeiten und die Änderungen von vorherigen User beim Speichern wieder überschreiben.
      Da es sich aber hier um eine eher lokae Datei handelt, wird für diese Problemstellung aktuell keine Lösung erarbeitet werden.

      Zudem ist auf Rat vom EDR ab V1.1 folgendes hinzugekommen, damit beim ReLoad der DbDataAdapter nicht ständig neu erstellt wird:

      VB.NET-Quellcode

      1. If DbcdarchivAdapter Is Nothing Then
      2. DbcdarchivAdapter = DBZugriff.DBZugriff(ProviderName, ConStr, CmdStr)
      3. End If

      Bilder
      • frmchoice.jpg

        10,77 kB, 392×361, 6.281 mal angesehen
      Dateien

      Dieser Beitrag wurde bereits 15 mal editiert, zuletzt von „Thias“ ()