Kopieren eines Bilds aus einer Datenbank direkt in ein PictureBox-Steuerelement mit Visual C sharp
In diesem Artikel wird beschrieben, wie Sie ein in einer Datenbank gespeichertes Bild direkt in ein PictureBox-Steuerelement auf einem Windows-Formular kopieren, ohne das Bild in einer Datei speichern zu müssen.
Originalversion des Produkts: Visual C #
Ursprüngliche KB-Nummer: 317701
Zusammenfassung
In diesem Schritt-für-Schritt-Artikel wird beschrieben, wie Sie ein in einer Datenbank gespeichertes Bild direkt in ein PictureBox-Steuerelement auf einem Windows-Formular kopieren, ohne das Bild in einer Datei speichern zu müssen.
In Visual Basic 6.0 besteht die einzige Möglichkeit zum Anzeigen eines Bilds aus einer Datenbank in einem PictureBox-Steuerelement, ohne den Zwischenschritt zum Speichern der {BLOB)-Daten des binären großen Objekts in einer Datei, darin, das PictureBox-Objekt an eine Datenquelle wie ein ADO-Datensteuerelement (ActiveX Data Objects) oder ein Recordset zu binden. Es gibt keine Möglichkeit (ohne Datenbindung), ein BLOB programmgesteuert in ein Steuerelement zu laden, ohne das Bild zur Verwendung durch die LoadPicture-Anweisung in einer Datei zu speichern.
In diesem Artikel verwenden wir das MemoryStream Objekt aus der System.IO Basisklasse, um die Bilddaten aus der Datenbank direkt in das PictureBox-Steuerelement zu kopieren.
Anforderungen
In der folgenden Liste sind die empfohlenen Hardware, Software, Netzwerkinfrastruktur und Service Packs aufgeführt, die Sie benötigen:
- Visual Studio .NET auf einem kompatiblen Windows Betriebssystem installiert
- Eine verfügbare Instanz von SQL Server oder eine verfügbare Access-Datenbank zum Testen
In diesem Artikel wird davon ausgegangen, dass Sie mit den folgenden Themen vertraut sind:
- Visual C# .NET Windows Forms-Anwendungen
- BLOB-Speicher (Binary Large Object) in Datenbanken
- ADO.NET Datenzugriff
Beispiel
Erstellen Sie eine SQL Server- oder Access-Tabelle mit der folgenden Struktur:
CREATE TABLE BLOBTest ( BLOBID INT IDENTITY NOT NULL, BLOBData IMAGE NOT NULL )Öffnen Sie Visual Studio .NET, und erstellen Sie eine neue Visual C# Windows Application Project.
Fügen Sie dem Standardmäßigen Formular1 aus der Toolbox ein PictureBox- und zwei Button-Steuerelemente hinzu. Legen Sie die
TextEigenschaft vonButton1" Datei" auf "Datenbank " und dieTextEigenschaft vonButton2" Datenbank" auf "PictureBox" fest.Fügen Sie die folgenden using-Anweisungen oben im Codemodul des Formulars ein:
using System.Data.SqlClient; using System.IO; using System.Drawing.Imaging;Fügen Sie die folgende Deklaration für die Datenbankverbindungszeichenfolge direkt in der öffentlichen Klasse Form1 hinzu:
System.Windows.Forms.Form classDeklaration und passen Sie die Verbindungszeichenfolge bei Bedarf an:String strCn = "Data Source=localhost;integrated security=sspi;initial catalog=mydata";Fügen Sie den folgenden Code in die
ClickEreignisprozedur vonButton1(Datei in Datenbank) ein. Passen Sie den Dateipfad bei Bedarf an eine verfügbare Beispielbilddatei an. Dieser Code liest die Bilddatei vom Datenträger (mithilfe einesFileStreamObjekts) in einByteArray und fügt dann die Daten mithilfe eines parametrisierten Command-Objekts in die Datenbank ein.try { SqlConnection cn = new SqlConnection(strCn); SqlCommand cmd = new SqlCommand("INSERT INTO BLOBTest (BLOBData) VALUES (@BLOBData)", cn); String strBLOBFilePath = @"C:\blue hills.jpg";//Modify this path as needed. //Read jpg into file stream, and from there into Byte array. FileStream fsBLOBFile = new FileStream(strBLOBFilePath,FileMode.Open, FileAccess.Read); Byte[] bytBLOBData = new Byte[fsBLOBFile.Length]; fsBLOBFile.Read(bytBLOBData, 0, bytBLOBData.Length); fsBLOBFile.Close(); //Create parameter for insert command and add to SqlCommand object. SqlParameter prm = new SqlParameter("@BLOBData", SqlDbType.VarBinary, bytBLOBData.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, bytBLOBData); cmd.Parameters.Add(prm); //Open connection, execute query, and close connection. cn.Open(); cmd.ExecuteNonQuery(); cn.Close(); } catch(Exception ex) { MessageBox.Show(ex.Message); }Fügen Sie den folgenden Code in die
ClickEreignisprozedur vonButton2(Database to PictureBox) ein. Dieser Code ruft die Zeilen aus derBLOBTestTabelle in der Datenbank in einDataSet, kopiert das zuletzt hinzugefügte Bild in einByteArray und dann in einMemoryStreamObjekt und lädt dasMemoryStreamBild dann in dieImageEigenschaft des PictureBox-Steuerelements.try { SqlConnection cn = new SqlConnection(strCn); cn.Open(); //Retrieve BLOB from database into DataSet. SqlCommand cmd = new SqlCommand("SELECT BLOBID, BLOBData FROM BLOBTest ORDER BY BLOBID", cn); SqlDataAdapter da = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); da.Fill(ds, "BLOBTest"); int c = ds.Tables["BLOBTest"].Rows.Count; if(c>0) { //BLOB is read into Byte array, then used to construct MemoryStream, //then passed to PictureBox. Byte[] byteBLOBData = new Byte[0]; byteBLOBData = (Byte[])(ds.Tables["BLOBTest"].Rows[c - 1]["BLOBData"]); MemoryStream stmBLOBData = new MemoryStream(byteBLOBData); pictureBox1.Image= Image.FromStream(stmBLOBData); } cn.Close(); } catch(Exception ex) { MessageBox.Show(ex.Message); }Drücken Sie F5 , um das Projekt zu kompilieren und auszuführen.
Klicken Sie auf die Schaltfläche " In Datenbank speichern", um mindestens ein Beispielbild in die Datenbank zu laden.
Klicken Sie auf die Schaltfläche " Datenbank in PictureBox ", um das gespeicherte Bild im PictureBox-Steuerelement anzuzeigen.
Wenn Sie das Bild aus dem PictureBox-Steuerelement direkt in die Datenbank einfügen möchten, fügen Sie ein drittes Schaltflächensteuerelement hinzu, und fügen Sie den folgenden Code in die
ClickEreignisprozedur ein. Dieser Code ruft die Bilddaten aus dem PictureBox-Steuerelement in einMemoryStreamObjekt ab, kopiert dieMemoryStreamDaten in einByteArray und speichert dasByteArray dann mithilfe eines parametrisierten Command-Objekts in der Datenbank.try { SqlConnection cn = new SqlConnection(strCn); SqlCommand cmd = new SqlCommand("INSERT INTO BLOBTest (BLOBData) VALUES (@BLOBData)", cn); //Save image from PictureBox into MemoryStream object. MemoryStream ms = new MemoryStream(); pictureBox1.Image.Save(ms, ImageFormat.Jpeg); //Read from MemoryStream into Byte array. Byte[] bytBLOBData = new Byte[ms.Length]; ms.Position = 0; ms.Read(bytBLOBData, 0, Convert.ToInt32(ms.Length)); //Create parameter for insert statement that contains image. SqlParameter prm = new SqlParameter("@BLOBData", SqlDbType.VarBinary, bytBLOBData.Length, ParameterDirection.Input, false, 0, 0,null, DataRowVersion.Current, bytBLOBData); cmd.Parameters.Add(prm); cn.Open(); cmd.ExecuteNonQuery(); cn.Close(); } catch(Exception ex) { MessageBox.Show(ex.Message); }Führen Sie das Projekt aus. Klicken Sie auf die Schaltfläche "Datenbank in PictureBox ", um ein zuvor gespeichertes Bild im PictureBox-Steuerelement anzuzeigen. Klicken Sie auf die neu hinzugefügte Schaltfläche, um das Bild aus dem PictureBox-Objekt in der Datenbank zu speichern. Klicken Sie dann erneut auf die Schaltfläche " Datenbank in PictureBox ", um zu bestätigen, dass das Bild ordnungsgemäß gespeichert wurde.
Fallstricke
Dieser Test funktioniert nicht mit der Spalte "Foto" in der Tabelle "Employees" der Northwind-Beispieldatenbank, die mit Access und SQL Server verteilt wird. Die in der Spalte "Photo" gespeicherten Bitmapbilder sind mit den Kopfzeileninformationen umschlossen, die vom OLE-Containersteuerelement Visual Basic 6.0 erstellt wurden.
Wenn Sie zum Testen dieses Codes eine Access-Datenbank verwenden müssen, müssen Sie die Spalte in der Access-Tabelle als Typ OLE-Objekt erstellen und den
System.Data.OleDbNamespace mit dem Jet 4.0-Anbieter anstelle desSystem.Data.SqlClientNamespaces verwenden.