Freigeben über


Kopieren eines Bilds aus einer Datenbank direkt in ein PictureBox-Steuerelement mit visual C scharf

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

  1. Erstellen Sie eine SQL Server- oder Access-Tabelle mit der folgenden Struktur:

    CREATE TABLE BLOBTest
    (
        BLOBID INT IDENTITY NOT NULL,
        BLOBData IMAGE NOT NULL
    )
    
  2. Öffnen Sie Visual Studio .NET, und erstellen Sie ein neues Visual C#-Windows-Anwendungsprojekt.

  3. Fügen Sie der Toolbox ein PictureBox- und zwei Schaltflächensteuerelemente zum Standardformular1 hinzu. Legen Sie die Text Eigenschaft von Button1 "Datei auf Datenbank " und die Text Eigenschaft von Button2 "Database" auf "PictureBox" fest.

  4. Fügen Sie oben im Codemodul des Formulars die folgenden using-Anweisungen ein:

    using System.Data.SqlClient;
    using System.IO;
    using System.Drawing.Imaging;
    
  5. 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";
    
  6. Fügen Sie den folgenden Code in die Click Ereignisprozedur von Button1 (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 einem FileStream Objekt) in ein Byte 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);
    }
    
  7. Fügen Sie den folgenden Code in die Click Ereignisprozedur von Button2 (Database to PictureBox) ein. Dieser Code ruft die Zeilen aus der Tabelle in der BLOBTest Datenbank in ein DataSet, kopiert das zuletzt hinzugefügte Bild in ein Byte Array und dann in ein MemoryStream Objekt und lädt dann die MemoryStream in die Image 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);
    }
    
  8. Drücken Sie F5, um das Projekt zu kompilieren und auszuführen.

  9. Klicken Sie auf die Schaltfläche "Datei in Datenbank ", um mindestens ein Beispielbild in die Datenbank zu laden.

  10. Klicken Sie auf die Schaltfläche "Datenbank in PictureBox ", um das gespeicherte Bild im PictureBox-Steuerelement anzuzeigen.

  11. 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 ein MemoryStream Objekt ab, kopiert das MemoryStream Array in ein Byte Array und speichert dann das Byte 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);
    }
    
  12. 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 des System.Data.SqlClient Namespaces mit dem Jet 4.0-Anbieter verwenden.