TB

C# und SQLite – Eine kleine Einführung

Geschrieben am Sonntag, 25. Januar 2009

Im Moment arbeite ich mal wieder an einem Projekt – genauer gesagt an einer kleinen Windows-Anwendung, welche in der Programmier-Sprache C# geschrieben ist. Diese Anwendung soll unter anderem verschiedene Daten erfassen sowie speichern. Dass für solch einen Verwendungszweck eine Datenbank von Vorteil sein würde, war schnell klar. Dem Benutzer einen kompletten Datenbank-Server wie MySQL geschweige denn Microsoft SQL-Server aufzuzwingen, nur damit eine kleine Anwendung einfache Datenbank-Abfragen ausführen kann, ist allerdings mehr als unzumutbar.

Nach ein klein wenig Recherche bin ich dann relativ schnell auf SQLite gestoßen – eine nur wenige hundert Kilobyte große Bibliothek, die ein relationales Datenbanksystem entält. Da SQLite allerdings in C geschrieben ist, ging es mit der Suche gleich wieder weiter, da ich einen entsprechenden Wrapper für C# benötige. Da es davon einige gibt, deren Dokumentation aber oftmals alles andere als ausführlich ist, habe ich mich dazu entschlossen, ein kurzes Tutorial zu schreiben, welches eine kleine Hilfe bei den ersten Schritten der Implementierung sein soll.

Letzte Aktualisierung: 03. Oktober 2010

1. Auswahl eines Wrappers

C#-Wrapper für SQLite gibt es, wie bereits erwähnt, einige – entschieden habe ich mich am Ende für „System.Data.SQLite“, einem kostenlosen C#-/ADO.NET-Wrapper. Dieser liegt aktuell in der Version 1.0.60.0 vor, scheint mir recht aktuell zu sein und bietet eine recht umfangreiche API-Dokumentation an.

Die aktuellste Version findet man immer auf folgender Website zum Download:
System.Data.SQLite – An open source ADO.NET provider for the SQLite database engine

2. Einbinden des Wrappers in die Anwendung

Sobald man das heruntergeladene Wrapper-Archiv entpackt, findet man im /bin-Ordner mehrere Dateien und Unter-Verzeichnisse. Benötigt wird lediglich die Datei „System.Data.SQLite.DLL“, welche man für verschiedene Plattformen in folgenden Ordnern vorfindet:

Weitere Informationen, vor allem in Bezug zum Compact Framework, findet man in der Hilfe-Datei im /Doc-Ordner.

Hat man sich die entsprechende „System.Data.SQLite.DLL“ herausgesucht, kopiert man sich diese in das Projekt-Verzeichnis unserer Anwendung und fügt mit Hilfe eines Rechtsklick auf den Ordner „Verweise“ im Projektmappen-Explorer der Projekt-Mappe einen neuen Verweis auf diese DLL hinzu.

Nicht zu vergessen ist die spätere Einbindung der Using-Direktive im Quell-Code:

using System.Data.SQLite;

Ist dies getan, kann es auch schon losgehen.

3. Definition einer Daten-Datei und Herstellung der Verbindung

Für die Daten-Datei lässt sich ein beliebiger Name definieren. Für unser Beispiel habe ich den Namen „SQLiteDemo.db“ genommen.

string dataSource = "SQLiteDemo.db";

Als nächstes wird eine Datenbank-Verbindung geöffnet:

SQLiteConnection connection = new SQLiteConnection();

connection.ConnectionString = "Data Source=" + dataSource;
connection.Open();

Damit wäre die Verbindung hergestellt und es können nun nach belieben Tabellen erstellt und Daten hinzugefügt werden.

4. Erstellen einer Tabelle und Einfügen von Daten

Im folgenden Abschnitt erstellen wir eine Tabelle mit dem Namen „beispiel“, welches zwei Felder enthält, und füllen es mit einem Beispiel-Datensatz:

SQLiteCommand command = new SQLiteCommand(connection);

// Erstellen der Tabelle, sofern diese noch nicht existiert.
command.CommandText = "CREATE TABLE IF NOT EXISTS beispiel ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(100) NOT NULL);";
command.ExecuteNonQuery();

// Einfügen eines Test-Datensatzes.
command.CommandText = "INSERT INTO beispiel (id, name) VALUES(NULL, 'Test-Datensatz!')";
command.ExecuteNonQuery();

// Freigabe der Ressourcen.
command.Dispose();

5. Auslesen der eingefügten Daten

Da nun eine Tabelle erstellt sowie ein Datensatz in die eben erstellte Tabelle eingefügt wurde, lesen wir nun diesen Datensatz wieder aus und lassen ihn uns an der Konsole ausgeben:

command = new SQLiteCommand(connection);

// Auslesen des zuletzt eingefügten Datensatzes.
command.CommandText = "SELECT id, name FROM beispiel ORDER BY id DESC LIMIT 0, 1";

SQLiteDataReader reader = command.ExecuteReader();

while (reader.Read())
{
Console.WriteLine("Dies ist der {0}. eingefügte Datensatz mit dem Wert: \"{1}\"", reader[0].ToString(), reader[1].ToString());
}

// Beenden des Readers und Freigabe aller Ressourcen.
reader.Close();
reader.Dispose();

command.Dispose();

6. Schließen der Verbindung

Zu guter letzt geben wir noch die Verbindungs-Ressourcen frei und schließen die geöffnete Datenbank-Verbindung mit folgendem Befehl:

connection.Close();
connection.Dispose();


7. Wichtiger Hinweis für 64-Bit Entwicklungsumgebungen!

Sollte es sich bei der verwendeten Entwicklungsumgebung um ein 64-Bit System handeln, kommt es unter Umständen bei der Kompilierung zu einer Fehlermeldung. Um diesen Fehler zu umgehen muss folgende Einstellung manuell in den Projekt-Eigenschaften gesetzt werden (Anleitung für Visual Studio 2010, sollte aber für ältere Versionen nahezu identisch sein):

Nun sollte sich die Anwendung auch problemlos unter 64-Bit-Entwicklungsumgebungen kompilieren lassen. Alternativ kann man natürlich auch einfach die 64-Bit System.Data.SQLite.DLL einbinden. :-)

Fertig!

Das war’s dann auch schon. Wie man sieht, ist die Benutzung recht einfach und logisch aufgebaut. Zum besseren Verständnis biete ich die komplette Projekt-Mappe mit allen Quell-Dateien noch zum Download an:

SQLite-Demo.zip: Projekt-Mappe und Quell-Dateien

Vielleicht war dieses kleine Tutorial ja für den ein oder anderen hilfreich. ;-)

connection.Dispose();

Kommentare (74):

iMarcel 21. April 2009

Danke für das kleine Tutorial. War ein hilfreicher Einstieg!

Sebi 23. Juni 2009

Hi, habe gerade ein Problem:

command.CommandText = „INSERT INTO datenbank (id, eintrag1, eintrag2) VALUES(NULL, “ + var1+ „, “ + var2+ „)“;

Komischerweiße kommt immer statdem wert, der Variablen-Name in die die Datenbank. Hat jemdand da eine Idee?

Thomas Belser 23. Juni 2009

Von welchem Datentyp sind denn die beiden Werte? Falls es Strings sind, kannst du es ja mal damit probieren:

command.CommandText = „INSERT INTO datenbank (id, eintrag1, eintrag2) VALUES(NULL, ‚“ + var1 + „‚, ‚“ + var2 + „‚)“;

Sebi 25. Juni 2009

Ja Strings! Hat geklappt DANKE!

sebi

Christian 25. August 2009

Danke. ;-)

Michael 9. September 2009

Ich möchte die Zeichen ‚ % in die Datenbank schreiben.

Wie geh ich vor?

Thomas Belser 10. September 2009

Sollte hiermit gehen:

command.CommandText = „INSERT INTO beispiel (id, name) VALUES(NULL, \“‚ %\“)“;

Michael 14. Oktober 2009

Danke! Gute Anleitung!

Nightraven 27. Dezember 2009

Danke für die super Anleitung :)

Ben 4. Januar 2010

Thanks for the little tutorial. I liked this one and it really helped me getting started! :-)

Andreas 6. Januar 2010

Hallo Thomas,
danke für die kleine Einführung.

Martin 12. Januar 2010

Good one. You know sqlitespy? Nice tool for sqlite db files.

mrhans 22. Januar 2010

Hallo Leute,
Anleitung ist sehr gut!
Allerdings liest ihr mit eurem Code ja nur die ersten zwei Einträge aus.
Wie sieht es aus wenn die Tabelle mehr Spalten enthält?

Wie lese ich diese aus?
While sagt ja aus, solange bis nicht neues mehr da ist.
Bei mir sind aber 9 Spalten mit Inhalt vorhanden aber nur die ersten beiden (id und vorname) werden ausgegeben.

Bitte um Hilfe !!!

Thomas Belser 26. Januar 2010

Mit einem einfachen * sollten eigentlich – wie bei SQL üblich – alle Spalten ausgegeben werden, also:

command.CommandText = „SELECT * FROM beispiel ORDER BY id DESC LIMIT 0, 1“;

Harry B. 10. Februar 2010

Auch ich beschäftige mich sporadisch mit C# und SQLite. Ich kann mittlerweile auch Daten aus eine SQLite Tabelle auslesen und sie in einem DataGridView anzeigen. Weiter kann ich die Zeilen des DataGridViews per Drag&Drop umsortieren und eine Spalte von oben nach unten durchnumerieren.

Aber es will mir einfach nicht gelingen, diese Änderungen wieder in der Datenbank zu speichern. Ich habe schon verschieden Dinge probiert, aber es klappt nicht.

Da ich vermute, dass ich einen grundsätzlichen Fehler mache, würde ich Dir gerne mein Projekt zusenden. Dann könntest Du vielleicht einmal schauen, was da falsch läuft.

Zufällig Hier 2. April 2010

Für gewöhnlich schließt man erst die Verbindung (Close) und im nächsten Schritt entsorgt man die belegten Ressourcen (Dispose).

Also ist das Konstrukt:
connection.Dispose();
connection.Close();

… verkehrt herum. Vertauscht wäre richtiger:
connection.Close();
connection.Dispose();

Juri Boxberger 29. April 2010

Woooha!!!!
Danke sehr, genau was ich gebraucht habe!!!

Ich habe es zunächst mit MS Access probiert…
Wie man soooo am SQL vorbei eiern kann… das ist unglaublich.

Fazit: NO Access = NO Problem!!!

SQLite Rulez!

Jan Lüders 1. Mai 2010

Perfekt… genau das wss ich für die Entwicklung gerbaucht habe. Ganz grosses Danke!

Mäx 6. Mai 2010

Wirklich gutes HowTo,

vielen Dank das war sehr hilfreich.

Thomas Belser 10. Mai 2010

@ Zufällig Hier: Danke für die Information. Ich habe diesen Teil korrigiert. :)

paul 21. Juni 2010

// Beenden des Readers und Freigabe aller Ressourcen.
reader.Dispose();
reader.Close();

an der stelle auf verkert rum

Florian 29. Juni 2010

Hallo zusammen,

vielen Dank erstmal für diese super Einführung. Versuche mich gerade auch zum ersten Mal mit C# in Verbindung mit SQLite Dbs und habe, nachdem ich diese Einführung jetzt brav abgetippt und die SQLite.NET version 1.0.66.0 eingebunden habe kommt bei mir beim ausführen eine Fehlermeldung, mit der ich leider nichts Anfangen kann.
Den Code aus dieser Einführung habe ich wie schon gesagt nur abgetippt. und zwar in meine Windows Forms Anwendung mit Framework 2.0 auf Visual Studio 2010. Der Code soll ausgeführt werden, wenn ich auf einen Button drücke und dann den Eintrag in eine TextBox schreiben.
C#, C/C++ Erfahrung habe ich bereits gesammelt. Also ganz unwissend bin ich dann doch nicht ; )

So, nun zur Fehlermeldung (erscheint, wenn ich auf den Button klicke):

Informationen über das Aufrufen von JIT-Debuggen
anstelle dieses Dialogfelds finden Sie am Ende dieser Meldung.

************** Ausnahmetext **************
System.InvalidOperationException: No connection associated with this command
bei System.Data.SQLite.SQLiteCommand.InitializeForReader()
bei System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
bei System.Data.SQLite.SQLiteCommand.ExecuteReader()
bei Datenbanken.Form1.button1_Click(Object sender, EventArgs e) in D:\C#-Projects\Datenbanken\Datenbanken\Form1.cs:Zeile 49.
bei System.Windows.Forms.Control.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
bei System.Windows.Forms.Button.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

************** Geladene Assemblys **************
mscorlib
Assembly-Version: 2.0.0.0.
Win32-Version: 2.0.50727.4927 (NetFXspW7.050727-4900).
CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll.
—————————————-
Datenbanken
Assembly-Version: 1.0.0.0.
Win32-Version: 1.0.0.0.
CodeBase: file:///D:/C%23-Projects/Datenbanken/Datenbanken/bin/Debug/Datenbanken.exe.
—————————————-
System.Windows.Forms
Assembly-Version: 2.0.0.0.
Win32-Version: 2.0.50727.4927 (NetFXspW7.050727-4900).
CodeBase: file:///C:/Windows/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.
—————————————-
System
Assembly-Version: 2.0.0.0.
Win32-Version: 2.0.50727.4927 (NetFXspW7.050727-4900).
CodeBase: file:///C:/Windows/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll.
—————————————-
System.Drawing
Assembly-Version: 2.0.0.0.
Win32-Version: 2.0.50727.4927 (NetFXspW7.050727-4900).
CodeBase: file:///C:/Windows/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.
—————————————-
System.Configuration
Assembly-Version: 2.0.0.0.
Win32-Version: 2.0.50727.4927 (NetFXspW7.050727-4900).
CodeBase: file:///C:/Windows/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll.
—————————————-
System.Xml
Assembly-Version: 2.0.0.0.
Win32-Version: 2.0.50727.4927 (NetFXspW7.050727-4900).
CodeBase: file:///C:/Windows/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll.
—————————————-
System.Data.SQLite
Assembly-Version: 1.0.66.0.
Win32-Version: 1.0.66.0.
CodeBase: file:///C:/Windows/assembly/GAC_32/System.Data.SQLite/1.0.66.0__db937bc2d44ff139/System.Data.SQLite.dll.
—————————————-
System.Data
Assembly-Version: 2.0.0.0.
Win32-Version: 2.0.50727.4927 (NetFXspW7.050727-4900).
CodeBase: file:///C:/Windows/assembly/GAC_32/System.Data/2.0.0.0__b77a5c561934e089/System.Data.dll.
—————————————-
System.Transactions
Assembly-Version: 2.0.0.0.
Win32-Version: 2.0.50727.4927 (NetFXspW7.050727-4900).
CodeBase: file:///C:/Windows/assembly/GAC_32/System.Transactions/2.0.0.0__b77a5c561934e089/System.Transactions.dll.
—————————————-
System.EnterpriseServices
Assembly-Version: 2.0.0.0.
Win32-Version: 2.0.50727.4927 (NetFXspW7.050727-4900).
CodeBase: file:///C:/Windows/assembly/GAC_32/System.EnterpriseServices/2.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll.
—————————————-
System.Windows.Forms.resources
Assembly-Version: 2.0.0.0.
Win32-Version: 2.0.50727.4927 (NetFXspW7.050727-4900).
CodeBase: file:///C:/Windows/assembly/GAC_MSIL/System.Windows.Forms.resources/2.0.0.0_de_b77a5c561934e089/System.Windows.Forms.resources.dll.
—————————————-
mscorlib.resources
Assembly-Version: 2.0.0.0.
Win32-Version: 2.0.50727.4927 (NetFXspW7.050727-4900).
CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll.
—————————————-

************** JIT-Debuggen **************
Um das JIT-Debuggen (Just-In-Time) zu aktivieren, muss in der
Konfigurationsdatei der Anwendung oder des Computers
(machine.config) der jitDebugging-Wert im Abschnitt system.windows.forms festgelegt werden.
Die Anwendung muss mit aktiviertem Debuggen kompiliert werden.

Zum Beispiel:

Wenn das JIT-Debuggen aktiviert ist, werden alle nicht behandelten
Ausnahmen an den JIT-Debugger gesendet, der auf dem
Computer registriert ist, und nicht in diesem Dialogfeld behandelt.

—————————————–

Vielen Dank schonmal!!
Liebe Grüße,

Florian

Thomas Belser 29. Juni 2010

Nur so rein aus Interesse:
Benutzt du dein Visual Studio 2010 mit einem 64-Bit Windows Betriebssystem?

Falls ja, dann wähle einmal bei den Projekt-Einstellungen im Bereich „Erstellen“ als Zielplattform „x86“ aus, kompiliere deine Anwendung erneut und versuche es dann noch einmal.

In Zusammenhang mit Visual Studio 2010 und einem 64-Bit Windows-Betriebssystem hatte ich nämlich mit meiner Projekt-Mappe ähnliche Probleme, welche ich damit lösen konnte. :-)

Florian 6. Juli 2010

Hey,
danke für die schnelle Antwort. Habe das Problem gefunden. War ein simpler programmierfehler ^^

Jetzt habe ich aber ein weiteres Problem : (

Und zwar habe ich jetzt ein schönes Tool geschrieben, was aufgaben in einer Datenbank ablegen kann.
Funktioniert auch alles super. Konnte die db sogar im netzwerk ablegen und darauf zugreifen.

Jetzt wollte ich es aber auf einem anderen Computer im Netzwerk ausprobieren und da hängt sich das programm immer direkt auf. (aufgabe.exe hat ein problem festgestellt und muss beendet werden)
Auf dem Zielcomputer läuft win7 mit framework 3.5 und sqlite 1.0.66.0 (das selbe wie bei mir). Wieso klappt das nicht?
Habe schon ein minitestprogramm ohne sqlite geschrieben und auf dem anderen rechner ausprobiert. das läuft.
Muss also irgendwie mit sqlite zusammenhängen…

Ich hoffe, du kannst mir auch hier weiterhelfen =)

danke und liebe Grüße!

Florian

Markus 3. September 2010

Hallo,

mir ist aufgefallen, dass Du im Codeblock #5 dispose und close (beim Reader) ebenfalls vertauscht hast.

Als Hinweise: natürlich könnte man statt dem expliziten dispose Aufruf auch
using(var cmd = new SQLiteCommand())
{ … } verwenden.

Markus 3. September 2010

pw:

natürlich danke für das tutorial :)

Thomas Belser 3. September 2010

Stimmt, dies wollte ich eigentlich die letzten Wochen schon ändern aber hatte es immer wieder vergessen. Danke nochmal für den Hinweis. Ich werde dies die Tage aktualisieren. :)

Thomas Belser 7. September 2010

Ich habe den Artikel sowie das .zip-Archiv soeben aktualisiert und einen Hinweis für die Entwicklung unter 64-Bit-Betriebssystemen hinzugefügt.

Hans 17. September 2010

Hallo,
erstmal 1000Dank für das super „Tutorial“, doch scheint mir immernoch das vertauschen von „.Dispose()“ und „.Close()“ der Fall zu sein.
LG

Thomas Belser 18. September 2010

Verdammt, nun sollte es aber stimmen. Das kommt davon, wenn man in der Hektik Copy&Paste benutzt. :-)

Hans 21. September 2010

Nun stimmt alles, vielen Dank nochmal, hat mir sehr geholfen für mein Projekt! :-)

Peter 7. Oktober 2010

Hallo,

Dein Beispiel ist echt super, hat mir sehr geholfen. Habe nun ein Problem. Wenn ich die entsprechenden DLL’s und exen in ein Verzeichnis kopiere um es an Kunden weiterzugeben, bekomme ich folgende Fehlermeldung:
Der angeforderte .Net Framework-Datenprovider kann nicht gefunden werden. Er ist ggf. nicht installiert.
Muss ich den Provider vorher immer installieren, ich dachte da reichen die DLL’s von SQLite.
Vielen Dank im voraus

Peter

Thomas Belser 7. Oktober 2010

Hallo Peter,

ändere bitte einmal wie in Punkt 7 beschrieben die Zielplattform auf x86 und gib mir dann bescheid, ob es nun funktioniert.

Gruß,
Thomas

Peter 7. Oktober 2010

Hallo Thomas,

habe ich wie beschrieben eingestellt, gleiche Fehlermeldung. Wobei ich für den Connect folgendes verwende: DbProviderFactories.GetFactory(„System.Data.SQLite“)
An was könnte es denn noch liegen?
Danke im voraus.

Peter

Thomas Belser 7. Oktober 2010

Puh, da kann ich dir im moment leider nicht weiterhelfen. Aber schaue mal auf der folgenden Seite nach:

http://sqlite.phxsoftware.com/readme.htm

Dort befindet sich ziemlich am Anfang ein Eintrag bezüglich DbFactory-Support, welcher besagt, dass man die app.config-Datei mit dem dort angegebenen Code erweitern muss. Vielleicht klappt es ja damit.

Gruß,
Thomas

Lucas 30. November 2010

Bei mir funktioniert es auch nicht, sobald ich die Software auf einem anderen Rechner ausführen will..

Thomas Belser 30. November 2010

Inwiefern unterscheidet sich der andere Rechner? 32/64-Bit System? Andere .NET-Framework-Version? Betriebssystem? Ein paar genauere Infos wären nicht schlecht.

null_plan 1. Dezember 2010

Hi, danke erstmal für das gelungene Tutorial. Ist echt gut und genau das was ich gesucht habe!
Nur eine Frage noch, wenn man das Projekt veröffentlicht verschwindet die Datenbank und man hat sie nicht mehr als einzelne Datei, was finde ich sehr unpraktisch ist. Wie erreicht man denn, dass die Datenbank als separate Datei erstellt wird, sodass man später zum Beispiel eine Sicherung davon anlegen kann?

Thomas Belser 1. Dezember 2010

Die Datenbank sollte eigentlich immer als separate Datei erstellt werden. Diese Datei wird allerdings erst dann erstellt, wenn sie mit Inhalt gefüllt wird. In meinem Beispiel heisst die Datenbank-Datei „SQLiteDemo.db“ und befindet sich dort, wo auch deine ganzen anderen zugehörigen Projekt-Dateien installiert wurden.

Lucas 2. Dezember 2010

Es ist auch .NET 4 und ebenfalls 64 Bit. Es kommt ein fehler der besagt, dass die dll nicht gefunden werden kann. Aber im Verzeiichnis ist diese.

Lucas 2. Dezember 2010

Das hier ist die Meldung…

Informationen über das Aufrufen von JIT-Debuggen
anstelle dieses Dialogfelds finden Sie am Ende dieser Meldung.

************** Ausnahmetext **************
System.BadImageFormatException: Die Datei oder Assembly „System.Data.SQLite, Version=1.0.66.1, Culture=neutral, PublicKeyToken=db937bc2d44ff139“ oder eine Abhängigkeit davon wurde nicht gefunden. Es wurde versucht, eine Datei mit einem falschen Format zu laden.
Dateiname: „System.Data.SQLite, Version=1.0.66.1, Culture=neutral, PublicKeyToken=db937bc2d44ff139“
bei PSMServiceheft.Form1.Form1_Load(Object sender, EventArgs e)
bei System.Windows.Forms.Form.OnLoad(EventArgs e)
bei System.Windows.Forms.Form.OnCreateControl()
bei System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
bei System.Windows.Forms.Control.CreateControl()
bei System.Windows.Forms.Control.WmShowWindow(Message& m)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.ScrollableControl.WndProc(Message& m)
bei System.Windows.Forms.Form.WmShowWindow(Message& m)
bei System.Windows.Forms.Form.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

WRN: Protokollierung der Assemblybindung ist AUS.
Sie können die Protokollierung der Assemblybindungsfehler aktivieren, indem Sie den Registrierungswert [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) auf 1 festlegen.
Hinweis: Die Protokollierung der Assemblybindungsfehler führt zu einer gewissen Leistungseinbuße.
Sie können dieses Feature deaktivieren, indem Sie den Registrierungswert [HKLM\Software\Microsoft\Fusion!EnableLog] entfernen.

************** Geladene Assemblys **************
mscorlib
Assembly-Version: 4.0.0.0.
Win32-Version: 4.0.30319.1 (RTMRel.030319-0100).
CodeBase: file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll.
—————————————-
PSM Serviceberichte offline
Assembly-Version: 1.0.0.0.
Win32-Version: 1.0.0.0.
CodeBase: file://tsclient/C/Users/lucas.bauer/Documents/Visual%20Studio%202010/Projects/PSMServiceheft%20-%202.02/PSMServiceheft/bin/Debug/PSM%20Serviceberichte%20offline.exe.
—————————————-
System.Windows.Forms
Assembly-Version: 4.0.0.0.
Win32-Version: 4.0.30319.1 built by: RTMRel.
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.
—————————————-
System.Drawing
Assembly-Version: 4.0.0.0.
Win32-Version: 4.0.30319.1 built by: RTMRel.
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.
—————————————-
System
Assembly-Version: 4.0.0.0.
Win32-Version: 4.0.30319.1 built by: RTMRel.
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll.
—————————————-
System.Windows.Forms.resources
Assembly-Version: 4.0.0.0.
Win32-Version: 4.0.30319.1 built by: RTMRel.
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_de_b77a5c561934e089/System.Windows.Forms.resources.dll.
—————————————-
mscorlib.resources
Assembly-Version: 4.0.0.0.
Win32-Version: 4.0.30319.1 (RTMRel.030319-0100).
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_de_b77a5c561934e089/mscorlib.resources.dll.
—————————————-

************** JIT-Debuggen **************
Um das JIT-Debuggen (Just-In-Time) zu aktivieren, muss in der
Konfigurationsdatei der Anwendung oder des Computers
(machine.config) der jitDebugging-Wert im Abschnitt system.windows.forms festgelegt werden.
Die Anwendung muss mit aktiviertem Debuggen kompiliert werden.

Zum Beispiel:

Wenn das JIT-Debuggen aktiviert ist, werden alle nicht behandelten
Ausnahmen an den JIT-Debugger gesendet, der auf dem
Computer registriert ist, und nicht in diesem Dialogfeld behandelt.

Thomas Belser 2. Dezember 2010

Bist du sicher, dass du die entsprechende DLL mitkopiert hast und diese sich im selben Verzeichnis wie die .exe-Datei befindet?

Lucas 3. Dezember 2010

Ja, die .dll ist in dem selben Verzeichnis wie die .exe

Axel 22. Dezember 2010

Hallo,
ich habe deinen Code mal ausprobiert. Aber schon der Anfang wirft Fehler.

string dataSource = „SQLiteDemo.db“;
SQLiteConnection connection = new SQLiteConnection();
Fehler 4 „SqlLiteTest.Form1.connection“ ist ein(e) „Feld“, wird aber wie ein(e) „Typ“ verwendet. D:\cs\SqlLiteTest\SqlLiteTest\Form1.cs 27 9 SqlLiteTest

connection.ConnectionString = „Data Source=“ + dataSource;

connection.Open();

KN4CK3R 4. Januar 2011

Hallo,
ich bekomme es absolut nicht hin, Zeichen zu escapen.
string query = „SELECT \“as’asd\“ FROM test“; -> as’asd als Ausgabe
string query = „SELECT ‚as“asd‘ FROM test“; -> as“asd als Ausgabe
string query = „SELECT ‚as\\’asd‘ FROM test“; -> Exception, dass ‚ falsch wäre (mit “ passiert das gleiche)
Normalerweise ist SELECT ‚as\’a\“sd‘ FROM test doch ein gültiger SQL Befehl…?
 
greetz KN4CK3R

Thomas Belser 5. Januar 2011

Was willst du denn genau haben? as’a\”sd oder as’a”sd?

Falls ersteres, bitte
SELECT ‘as\’a\\”sd’ FROM test
verwebden, bei zweiterem verwende
SELECT ‘as\’a”sd’ FROM test

Wenn du nach einem \ suchst, musst du dies immer mit einem doppelten \, also \\ der Abfrage hinzufügen.

Gruß,
Thomas

KN4CK3R 5. Januar 2011

Ich möchte as’a“sd haben. Die doppelten \\ habe ich natürlich geschrieben, weil ich sie in C# ja escapen muss (ich habe den Pseudocode extra so zur Verdeutlichung geschrieben).
Das Problem tritt in meiner Anwendung auf, wenn ich einen String in der Datenbank speichern will, der ein ‚ enthält.
Sagen wir ich möchte den String „das ist ein Hochkomma -> ‚ <-“ speichern. Also würde meine Query zB so aussehen: INSERT INTO test (string) VALUES (‚das ist ein Hochkomma -> \‘ <-‚).
In C# würde es so aussehen: string query = „INSERT INTO test (string) VALUES (‚das ist ein Hochkomma -> \\‘ <-‚)“; Und da tritt dann der Fehler „unrecognized token: „‚)“ “ auf.
 
greetz KN4CK3R

Ilja 4. Februar 2011

Da hier viele Probleme mit den Sonderzeichen diskutiert werden, hier ist mein Vorschlag – die Parameters zu verwenden! Schon aus Sicherheitsüberlegungen sollte man sich damit befassen.

— Beispiel:

SQLiteCommand cmd= new SQLiteCommand(connection);

cmd.CommandText = „SELECT usr_id FROM users WHERE usr_name=@un AND usr_pwd=@pwd“;
cmd.Parameters.AddWithValue(

 

„@un“, „UserName“);
cmd.Parameters.AddWithValue(„@pwd“, „Password“);
int usrId=0;
object tmp = executeScalar(cmd);
if(tmp!=null)int.TryParse(tmp.ToString(),out usrId);

cmd.Dispose();

— Beispiel Ende

Genauso funktioniert es auch mit INSERT, UPDATE usw.

Ilja 4. Februar 2011

… na ja die Kommentarfunktion hat die Formatierung kaputt gemacht :-(

Es geht nur darum, dass die Zeile wie

cmd.Parameters.AddWithValue(“@pwd”, “Password”);

auf einfache Weise Parameter in das Query reinbringt und sie können direkt in SQL verwendet werden.

Man kann aber noch komplizierter machen und einzelne Parameter als Objekte erstellen. AddWithValue sollte aber im Normalfall reichen.

Andreas 20. Februar 2011

top! :)
dein artikel hat mir gerade sehr geholfen… :)

Bernhard 1. April 2011

Hallo,

ich setze einen Select auf eine virtuelle Tabelle in der Form select * from T_CONTENT where content match ‚Hallo‘; ab. Funktioniert aber nicht. Wird den kein FTS (FTS3) unterstützt?

Gruss

Weiphy 30. Mai 2011

Hallo…
 
erstmal danke für deine einführung
hätte 2 fragen…
1) gibts im net irgendwo ne liste für die ganzen commands für sql??
und 2) Ich bekomm bei dem command.ExecuteNonQuery(); immer ne fehlermeldung, („No connection associated with this command“)
weis aber nicht warum….
 
Hier das Programm:
SQLiteConnection connection = new SQLiteConnection();

connection.ConnectionString = „Data Source=“ + „Datenbank.db“;
connection.Open();

SQLiteCommand command = new SQLiteCommand();

command.CommandText = „CREATE TABLE IF NOT EXISTS datenbank ( id INTEGER, name VARCHAR(100));“;

command.ExecuteNonQuery();

command.CommandText = „INSERT INTO datenbank (id, name) VALUES (‚1‘ , ‚HALLOOOO‘);“;
command.ExecuteNonQuery();

connection.Close();
connection.Dispose();

Marvin 24. Juli 2011

Danke, hat sehr geholfen…

Brian 10. Juni 2012

Hallo Thomas,
 
sehr gute Einleitung die auch mir als „fortgeschrittener Anfänger“ auch noch was beigebracht hat.

Danke dafür…
 
Viele Grüsse,
Brian

Christian 6. Juli 2012

Hi,

Danke für den Artikel. Ich habe aber eine Frage: Wo finde ich 32bit-DLL für Windows? Wenn ich mir dir Binaries herunterlade, habe ich keinen Win32 Ordner.

Gruß
Christian 

Thomas Belser 7. Juli 2012

Mh, welche Version hattest du denn runtergeladen? Mein Guide hat sich auf die Version 1.0.60.0 bezogen – wie es mit neueren Versionen aussieht, kann ich leider nicht mehr sagen, da ich mich schon sehr lange nicht mehr mit diesem Thema beschäftigt habe.

Aounallah Mazen 29. Juli 2012

Danke Schöne, das war sehr hilfreich.

York 29. August 2012

Vielen Dank diese Anleitung hat mir beim einarbeiten von SQLite gut weitergeholfen. 

f0rkB0mb 22. Oktober 2012

hey,
netter, wenn auch alter artikel. habe mir auch so ein/zwei (kleine) projekte mit sqlite als db umgesetzt, weil ich für kleinere tools nicht (zwingend) einsehe mir ne tabelle auf nem sql-svr anzulegen, oder unbedingt jedesmal (schnell zugroßwerdende [von eventuellem ärger mit stored-procedures ganz zu schweigen]) access-dateien zu nutzen. der zugriff auf sqlite-dateien ist eigentlich völlig autark zu jedem anderen ado.net db zugriff… die sql-statements, oder besser die syntax derer, weichen lediglich etwas ab…aber sonst ist alles wie gewohnt.

auch ich hatte anfänglich probleme beim nutzen der 64 bit laufzeit, egal ob im GAC registriert, oder lokal im app-verzeichnis – jedesmal der penetrante hinweis das ich doch bitte die dll mit dem „public-keytoken: 0815-LMAA-XYZ“ mal verschwinden, und stattdessen die für die entsprechende .net-version vorgesehene verwenden soll…lösung:
64-bit libs deinstalliert, 32 bit libs gezogen und installiert, system rebootet und vs wieder angeschmissen – und siehe da, ich konnte nun auch endlich die namensräume via vs einbinden (add reference/verweis hinzufg.) und kein gemecker mehr vom csc.
beim deployment der tools verwende ich meist die allgemeinen app.config  einstellungen die von sqlite empfohlen werden (der hinweis auf die entsprechnde seite wurde schon etwas weiter oben vom autor des artikels gegeben).

vllt. hilf es ja irgend jemand weiter… :)
 
greetz, me

f0rkB0mb 22. Oktober 2012

nachtrag aus der hilfedatei:

<configuration>
<system.data>
<DbProviderFactories>
<remove invariant=“System.Data.SQLite“/>
<add name=“SQLite Data Provider“ invariant=“System.Data.SQLite“
description=“.Net Framework Data Provider for SQLite“
type=“System.Data.SQLite.SQLiteFactory, System.Data.SQLite“ />
</DbProviderFactories>
</system.data>
</configuration>

diese einstellunge sind meine favorisierten, da sie keine registration der libs im GAC benötigen,
und nur auf die im app-verz. angewendet werden.

greetz, me
 

Chris 23. Oktober 2012

In den neueren Releases liegt die 32bit Version des Wrappers direkt im „bin“-Ordner und nicht mehr in einem Unterordner wie Itanium und die 64bit-Variante.

Sunny 22. November 2012

Hallo,
Ich habe ein Problem, dass in der Tabelle einfach nichts geschrieben wird, obwohl ich genau so geschrieben habe wie Sie erklärt haben
!!!!!! 

Padhie 19. Januar 2013

Hi erstmal,
ich wollte die Anleitung oben nachmachen, um in „Visual Studio 2010“ eine sqlite datei in eine C# consolenanwendung einzubinden, aber das geht bei mir nicht.
Bei der Verbindung ( SQLiteConnection connection = new SQLiteConnection(); ) kommt eine Fehlermeldung bei mir:
„FileLoadException wurde nicht Behandelt.   Die Assembly im gemischten Modus wurde während Version v2.0.50727 der Laufzeit erstellt und kann nicht während der 4.0-Laufzeit ohne zusätzliche Konfigurationsinformationen geladen werden.“
was kann ich da tun? =*( ich komm da einfach nicht weiter

Joe St. 13. Februar 2013

Vielen Dank für das tolle Tutorial Thomas. Hat mir super geholfen.
LG aus Wien
 

Peter 2. Januar 2015

Noch ein Frohes Neues & ebenfalls vielen Dank für das Tutorial. ;)

Thomas K. 9. Oktober 2016

Hallo Thomas,

dein oben angegebener Link zu phxsoftware ist tot :(

Gruß

Blocko aka das Butterbrot 13. Oktober 2016

Danke für das kurze Tutorial, hat mir sehr weitergeholfen.

Thomas Belser 19. Oktober 2016

Hey,

ohje, der Artikel ist natürlich schon sehr alt und ich habe mich mit der ganzen Thematik leider auch schon länger nicht mehr beschäftigt. Die verlinkte Seite scheint wohl leider auch komplett gelöscht worden zu sein. Leider kann ich dir auch kein Backup der Dateien anbieten. Ich hoffe, dass du woanders eine Lösung finden kannst. :)

Carlton 29. Dezember 2016

Hi, nette Anleitung. Hast du denn auch eine Lösung mit EF6?

Ich versuche schon seit Tagen SQLite mit EF6 ans Laufen zu bekommen. Wenn ich das Model bilden will, kann ich „System.Data.SQLite“ nicht als Data Source auswählen. Ich verzweifel langsam.

 

Thomas Belser 30. Dezember 2016

Hallo,

leider kann ich dir damit momentan nicht weiterhelfen, da ich mich schon seit Jahren nicht mehr mit dem Thema beschäftigt habe.

Viele Grüße,
Thomas

Mehdi 12. September 2017

Hi,

unfortunately i cannot Germany but that was Great thx a lot.!

!Mehdi

 

Kommentar schreiben:


Kommentar: