Comment faire : copier une image à partir d'une base de données directement dans un contrôle PictureBox avec Visual Basic .NET

Numéro d'article: 317670 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Cet article étape par étape explique comment copier une image stockée dans une base de données directement dans un contrôle PictureBox sur un formulaire Windows sans avoir à enregistrer l'image dans un fichier.

Dans Microsoft Visual Basic 6.0, la seule manière d'afficher une image à partir d'une base de données dans un contrôle PictureBox , sans l'étape intermédiaire de l'enregistrement grand objet binaire {BLOB) les données dans un fichier consiste à lier le contrôle PictureBox à une source de données comme un objet Recordset ou contrôle (ActiveX Data Objects) données . Il n'existe aucun moyen de (sans liaison de données) pour charger par programme un objet BLOB dans un contrôle sans enregistrer l'image vers un fichier pour une utilisation par l'instruction LoadPicture .

Cet article utilise l'objet MemoryStream de la classe de base System.IO pour copier les données d'image de la base de données directement dans le contrôle PictureBox .

Configuration requise

La liste suivante met en évidence le matériel recommandé, logiciel infrastructure réseau et service packs dont vous aurez besoin :
  • Microsoft Visual Studio .NET est installé sur un système d'exploitation Microsoft Windows compatible
  • Une instance disponible de Microsoft SQL Server ou d'une base de données Microsoft Access disponible pour tester
Cet article suppose que vous êtes familiarisé avec les sujets suivants :
  • Les applications Visual Basic .NET Windows Forms
  • Objet BLOB Binary large () Object stockage dans les bases de données
  • Accès aux données ADO.NET

Exemple

  1. Créer un tableau SQL Server ou Access avec la structure suivante :
    CREATE TABLE BLOBTest
    (
    BLOBID INT IDENTITY NOT NULL,
    BLOBData IMAGE NOT NULL
    )
    					
  2. Démarrez Visual Studio .NET, puis créez une nouvelle application Visual Basic Windows Forms.
  3. Faites glisser un contrôle PictureBox et deux contrôles de bouton de la boîte à outils vers la valeur par défaut Form1. Définissez la propriété Text de Bouton1 dans un fichier à la base de données et définir la propriété Text de Bouton2 à la base de données à l'objet PictureBox .
  4. Ajoutez les instructions Imports suivantes en haut du module de code du formulaire :
    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.IO
    Imports System.Drawing.Imaging
    					
  5. Ajouter la déclaration suivante pour la chaîne de connexion de base de données sous public classe Form1 et ensuite modifier la chaîne de connexion que nécessaire pour votre environnement :
        Dim strCn As String = "Data Source=<server>;" & _
                "Initial Catalog=<database>;Integrated Security=SSPI"
    					
  6. Ajoutez le code suivant dans la procédure événementielle Click de Bouton1 ( fichier à base de données ). Modifiez le fichier chemin d'accès à un fichier image exemple disponibles que nécessaire. Ce code lit le fichier image à partir du disque (à l'aide d'un objet FileStream ) dans un tableau d'octets et insérer les données dans la base de données en utilisant un objet Command paramétré.
            Dim cn As New SqlConnection(strCn)
            Dim cmd As New SqlCommand("INSERT INTO BLOBTest (BLOBData) " & _
                "VALUES (@BLOBData)", cn)
            Dim strBLOBFilePath As String = _
                "C:\Documents and Settings\All Users\Documents" & _
                "\My Pictures\Sample Pictures\winter.jpg"
            Dim fsBLOBFile As New FileStream(strBLOBFilePath, _
                FileMode.Open, FileAccess.Read)
            Dim bytBLOBData(fsBLOBFile.Length() - 1) As Byte
            fsBLOBFile.Read(bytBLOBData, 0, bytBLOBData.Length)
            fsBLOBFile.Close()
            Dim prm As New SqlParameter("@BLOBData", SqlDbType.VarBinary, _
                bytBLOBData.Length, ParameterDirection.Input, False, _
                0, 0, Nothing, DataRowVersion.Current, bytBLOBData)
            cmd.Parameters.Add(prm)
            cn.Open()
            cmd.ExecuteNonQuery()
            cn.Close()
    					
  7. Ajoutez le code suivant dans la procédure événementielle Click de Bouton2 ( base de données pour un contrôle PictureBox ). Ce code récupère les lignes de la table BLOBTest dans la base de données dans un DataSet , copie le plus récemment ajouté image dans un tableau d'octets , puis dans un objet MemoryStream et charges puis MemoryStream dans la propriété Image du contrôle PictureBox .
            Dim cn As New SqlConnection(strCn)
            Dim cmd As New SqlCommand("SELECT BLOBID, " & _
                "BLOBData FROM BLOBTest ORDER BY BLOBID", cn)
            Dim da As New SqlDataAdapter(cmd)
            Dim ds As New DataSet()
            da.Fill(ds, "BLOBTest")
            Dim c As Integer = ds.Tables("BLOBTest").Rows.Count
            If c > 0 Then
                Dim bytBLOBData() As Byte = _
                    ds.Tables("BLOBTest").Rows(c - 1)("BLOBData")
                Dim stmBLOBData As New MemoryStream(bytBLOBData)
                picBLOB.Image = Image.FromStream(stmBLOBData)
            End If
    					
  8. Exécutez le projet.
  9. Cliquez sur le fichier à base de données pour charger au moins une image d'exemple dans la base de données.
  10. Cliquez sur base de données pour un contrôle PictureBox pour afficher l'image enregistrée dans le contrôle PictureBox .
  11. Si vous souhaitez pouvoir insérer l'image à partir du contrôle PictureBox directement dans la base de données, ajouter une troisième contrôle Button et puis ajoutez le code suivant dans la procédure événementielle Click . Ce code récupère les données image à partir du contrôle PictureBox dans un objet MemoryStream , copie MemoryStream dans un tableau d'octets et enregistrer le tableau d'octets dans la base de données en utilisant un objet Command paramétré.
            Dim cn As New SqlConnection(strCn)
            Dim cmd As New SqlCommand("INSERT INTO BLOBTest (BLOBData) " & _
                "VALUES (@BLOBData)", cn)
            Dim ms As MemoryStream = New MemoryStream()
            picBLOB.Image.Save(ms, ImageFormat.Jpeg)
            Dim bytBLOBData(ms.Length - 1) As Byte
            ms.Position = 0
            ms.Read(bytBLOBData, 0, ms.Length)
            Dim prm As New SqlParameter("@BLOBData", SqlDbType.VarBinary, _
                bytBLOBData.Length, ParameterDirection.Input, False, _
                0, 0, Nothing, DataRowVersion.Current, bytBLOBData)
            cmd.Parameters.Add(prm)
            cn.Open()
            cmd.ExecuteNonQuery()
            cn.Close()
    					
  12. Exécutez le projet. Cliquez sur base de données pour un contrôle PictureBox pour afficher une image déjà enregistrée dans le contrôle PictureBox . Cliquez sur le bouton nouveau pour enregistrer l'image à partir de l' objet PictureBox dans la base de données, puis cliquez sur base de données pour un contrôle PictureBox à nouveau pour confirmer que l'image a été enregistrée correctement.

Résolution des problèmes

  • Ce test ne fonctionnera pas avec la colonne photo dans la table Employees de la base de données les Comptoirs exemple distribué avec Access et SQL Server. Les images bitmap stockées dans la colonne photo sont regroupées avec les informations en-tête créées par le contrôle OLE Container Visual Basic 6.0.
  • Si vous souhaitez utiliser une base de données Access pour tester ce code, vous devez créer la colonne dans la table Access en tant que type objet OLE et utiliser l'espace de noms System.Data.OLEDB avec le fournisseur Microsoft Jet 4.0 au lieu de l'espace de noms System.Data.SqlClient .

Références

Pour plus d'informations sur l'utilisation des données BLOB avec Visual Basic .NET, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
308042 Comment faire pour lire et écrire des données BLOB à l'aide ADO.NET avec Visual Basic .NET
316887 Comment faire pour lire et écrire un fichier dans et à partir d'une colonne BLOB à l'aide d'ADO.NET et Visual Basic .NET

Propriétés

Numéro d'article: 317670 - Dernière mise à jour: vendredi 5 septembre 2003 - Version: 3.1
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft ADO.NET 1.1
  • Microsoft Visual Basic .NET 2002 Initiation
  • Microsoft Visual Basic .NET 2003 Initiation
Mots-clés : 
kbmt kbdraw kbgdi kbhowtomaster kbio kbsqlclient kbsystemdata KB317670 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 317670
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires