.NET
Microsoft SQL CE: Blobs Speichern und auslesen
Posted on .In diesem kleinem Tutorial möchte ich euch zeigen, wie man BLOBs (Binary Large Objects) in die Compact Edition vom Microsofts SQL Server speichern und wieder laden kann. Dies soll eine Art Weiterführung von dem letzten Einstiegspost sein. Ich kann euch aber nicht versprechen, dass noch weitere Beiträge zu dem Thema kommen werden.
Auch wen Relationale Datenbanken überwiegend dazu benutzt werden um Text-Basierte Informationen zu speichern, wie Benutzernamen, IP Adressen oder andere Texte, kommt es doch häufiger vor, dass man auch Dateien wie Bilder in eine Datenbank legen möchte. Dies ist zB. nützlich wenn man eine Benutzerdatenbank hat und zu jedem Benutzer ein Bild hinterlegen will.
Das Vorgehen an Sich ist dabei sehr ähnlich, ihr erstellt ein SqlCeCommand und fügt dem wie gewohnt einige Parameter hinzu:
using (SqlCeConnection con = new SqlCeConnection(conString)) { con.Open(); using (SqlCeCommand com = new SqlCeCommand ("INSERT INTO cp_image (date, image) VALUES (@Date, @Filename)", con)) { com.Parameters.AddWithValue("@Date", DateTime.Now.ToString()); com.Parameters.AddWithValue("@Filename", System.IO.File.ReadAllBytes(filename)).SqlDbType = SqlDbType.Image; com.ExecuteNonQuery(); } }Absolut nichts neues wie ihr sehen könnt, wir geben die Datei, die wir anhängen wollen einfach als byte-Array als Parameter mit.
Sehr wichtig ist hierbei folgende Stelle in Zeile 8:
.SqlDbType = SqlDbType.Image;
Wenn ihr diese Information nicht mit angebt, werdet ihr Probleme bekommen, sobald ihr eine Datei in die Datenbank schreiben wollt die größer ist als 8 KB!!! Denn wenn man einen Parameter angibt ohne dessen Typ mit anzugeben versucht SQLCE den Typ selbst zu bestimmen und wählt dazu dann den Typ varbinary, dessen Größe auf 8000 Byte beschränkt ist!
Mit dem Ausführen des SqlCeCommands sollte die Datei bzw. das Bild in diesem Fall dann in eure Datenbank Datei wandern.
Das Auslesen der Datei aus der Datenbank gestaltet sich ebenfalls nicht kompliziert. Hier meine Funktion um ein Bild aus der Datenbank zu lesen:
public Image getImageFromDB(int id) { Image img; byte[] imgData = null; using (SqlCeConnection con = new SqlCeConnection(conString)) { con.Open(); using (SqlCeCommand com = new SqlCeCommand ("SELECT image FROM cp_image WHERE id = '" + id.ToString() + "'", con)) { using (SqlCeDataReader dr = com.ExecuteReader()) { while (dr.Read()) { imgData = (byte[])dr["image"]; } } } } if (imgData != null) { //Es wurde ein Bild geladen MemoryStream ms = new MemoryStream(imgData); img = Image.FromStream(ms); return img; } return null; }Dazu benutze ich einfach nur einen gewöhnlichen DataAdapter, mit dem ich aus der Spalte namens „image“ die Bildinformationen auslese, diese müssen noch in ein byte-Array gecastet werden, da diese als Object geliefert werden.
Zum Schluss wird noch das Byte-Array in ein System.Drawing.Image verwandelt und zurückgegeben. Dies kann man dann zB. direkt in eine PictureBox laden.
Hier ist die Tabelle, die ich in diesem Beispiel benutzt habe:
Wie ihr eine Verbindung zur Datenbank herstellt und normale Select- und Insert-Befehle benutzt könnt ihr im Ersten Teil nachlesen.
Sebastian Gross
http://www.bigbasti.comSebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.
Author bigbasti87
Posted at 14:11 15. Juli 2010.
Bloggd: Microsoft SQL CE: Blobs Speichern und auslesen – http://blog.bigbasti.com/microsoft-sql-c… #sqlce #tutorial
Author Thomas
Posted at 18:03 31. Januar 2011.
Hi,
das ist echt super! Ich bin durch Zufall hier gelandet und finde eins zu eins genau das was ich suche.
Besten Dank dafür.
Thomas