Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel wird beschrieben, wie Sie ein in einer Datenbank gespeichertes Bild direkt in ein PictureBox-Steuerelement in einem Windows Form-Steuerelement kopieren, ohne das Bild in einer Datei speichern zu müssen.
Originalproduktversion: Visual C#
Ursprüngliche KB-Nummer: 317701
Zusammenfassung
In diesem schrittweisen Artikel wird beschrieben, wie Sie ein in einer Datenbank gespeichertes Bild direkt in ein PictureBox-Steuerelement in einem Windows Form-Steuerelement 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 dass der Zwischenschritt zum Speichern der {BLOB)-Daten des binär großen Objekts in einer Datei besteht darin, das PictureBox-Objekt an eine Datenquelle wie ein ActiveX Data Objects (ADO)-Datensteuerelement oder -Recordset zu binden. Es gibt keine Möglichkeit (ohne Datenbindung), ein BLOB programmgesteuert in ein Steuerelement zu laden, ohne das Bild in einer Datei zur Verwendung durch die LoadPicture-Anweisung 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 ein neues Visual C#-Windows-Anwendungsprojekt.
Fügen Sie der Toolbox ein PictureBox- und zwei Schaltflächensteuerelemente zum Standardformular1 hinzu. Legen Sie die
Text
Eigenschaft vonButton1
"Datei auf Datenbank " und dieText
Eigenschaft vonButton2
"Database" auf "PictureBox" fest.Fügen Sie oben im Codemodul des Formulars die folgenden using-Anweisungen ein:
using System.Data.SqlClient; using System.IO; using System.Drawing.Imaging;
Fügen Sie die folgende Deklaration für die Datenbank Verbindungszeichenfolge direkt innerhalb der öffentlichen Klasse Form1 hinzu:
System.Windows.Forms.Form class
Deklaration und Passen Sie die Verbindungszeichenfolge nach Bedarf an:String strCn = "Data Source=localhost;integrated security=sspi;initial catalog=mydata";
Fügen Sie den folgenden Code in die
Click
Ereignisprozedur vonButton1
(Datei in Datenbank) ein. Passen Sie den Dateipfad bei Bedarf an einer verfügbaren Beispielbilddatei an. Dieser Code liest die Bilddatei von einem Datenträger (mit einemFileStream
Objekt) in einByte
Array 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
Click
Ereignisprozedur vonButton2
(Database to PictureBox) ein. Dieser Code ruft die Zeilen aus der Tabelle in derBLOBTest
Datenbank in einDataSet
, kopiert das zuletzt hinzugefügte Bild in einByte
Array und dann in einMemoryStream
Objekt und lädt dann dieMemoryStream
in dieImage
Eigenschaft 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 "Datei in Datenbank ", 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 Button-Steuerelement hinzu, und fügen Sie den folgenden Code in die
Click
Ereignisprozedur ein. Dieser Code ruft die Bilddaten aus dem PictureBox-Steuerelement in einMemoryStream
Objekt ab, kopiert dasMemoryStream
Array in einByte
Array und speichert dann dasByte
Array 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 zu PictureBox ", um zu bestätigen, dass das Bild ordnungsgemäß gespeichert wurde.
Fallgruben
Dieser Test funktioniert nicht mit der Spalte "Foto" in der Tabelle "Mitarbeiter" der Northwind-Beispieldatenbank, die mit Access und SQL Server verteilt wird. Die in der Spalte "Foto" gespeicherten Bitmapbilder werden mit den Kopfzeileninformationen umschlossen, die vom Visual Basic 6.0 OLE-Container-Steuerelement erstellt wurden.
Wenn Sie zum Testen dieses Codes eine Access-Datenbank verwenden müssen, müssen Sie die Spalte in der Access-Tabelle als OLE-Objekttyp erstellen und den
System.Data.OleDb
Namespace anstelle desSystem.Data.SqlClient
Namespaces mit dem Jet 4.0-Anbieter verwenden.