none
Charger données BLOB dans une PictureBox RRS feed

  • Question

  • Bonjour,

    comme indiqué dans la question j'aimerais charger des données Blob d'une base SQL Server dans un PictureBox ; je suis tombé sur ce lien : https://support.microsoft.com/fr-fr/help/321900/how-to-display-an-image-from-a-database-in-a-windows-forms-picturebox

    J'ai testé la solution avec ce code :

    document = New System.Data.SqlClient.SqlCommand("SELECT INFODOC FROM IMAGE WHERE IUDOC = '0000123008'", ConnexionSQL)
                Dim dr As SqlDataReader
    
                dr = document.ExecuteReader(CommandBehavior.CloseConnection)
    
                If dr.Read Then
                    Dim bytBLOBData(dr.GetBytes(1, 0, Nothing, 0, Integer.MaxValue) - 1) As Byte
                    dr.GetBytes(1, 0, bytBLOBData, 0, bytBLOBData.Length)
                    Dim stmBLOBData As New MemoryStream(bytBLOBData)
                    PictureBox1.Image = Image.FromStream(stmBLOBData)
                End If
    
                dr.Close()

    Mais j'obtiens "L'index se trouve en dehors des limites du tableau."

    Il s'agit d'une partie que je maitrise peu, je ne vois pas comment résoudre cette erreur, ma donnée BLOB est trop volumineuse peut-être ? comment le vérifier ?

    Merci d'avance de votre aide


    mercredi 13 septembre 2017 12:22

Réponses

  • Pour ceux qui pourraient rencontrer le même souci que moi, j'ai réussi à m'en sortir ainsi :

    J'ai viré le DataReader et remplacé ça :

    Dim bytBLOBData(dr.GetBytes(0, 0, Nothing, 0, Integer.MaxValue) - 1)AsByte dr.GetBytes(0, 0, bytBLOBData, 0, bytBLOBData.Length)

    par :

    Dim bytBLOBData()AsByte = DirectCast(document.ExecuteScalar(), Byte())

    et c'est ok.

    jeudi 21 septembre 2017 06:32

Toutes les réponses

  • Bonjour rocketter,

    Comment avez-vous défini SqlCommand ?
    Je vous invite à consulter le thread suivant :
    Index was outside the bounds of the Array. (Microsoft.SqlServer.smo)

    Cordialement,
    Teodora


    Votez! Appel à la contribution TechNet Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    jeudi 14 septembre 2017 12:15
    Modérateur
  • Bonjour,

    merci de votre réponse.

    Je ne suis pas sur de comprendre votre question sinon, le SqlCommand, je l'ai défini ainsi :

    Dim document As System.Data.SqlClient.SqlCommand

    Quant au lien proposé, la situation que décrit la personne ne s'applique pas à mon cas. Elle semble se connecter à son serveur SQL 2012 via une install locale de Management Studio en 2008.

    Dans mon code je ne me sers pas de Management Studio, j'accède directement au serveur via ado.net et la chaine de connexion qui va bien.

    vendredi 15 septembre 2017 08:31
  • J'ai réussi à aller plus loin en remplaçant cette ligne :

    Dim bytBLOBData(dr.GetBytes(1, 0, Nothing, 0, Integer.MaxValue) - 1) As Byte

    par celle-ci:

    Dim bytBLOBData(dr.GetBytes(0, 0, Nothing, 0, Integer.MaxValue) - 1) As Byte

    maintenant par contre le programme m'indique ceci : Le paramètre n'est pas valide en arrivant sur cette ligne :

    PictureBox1.Image = Image.FromStream(stmBLOBData)

    mardi 19 septembre 2017 07:57
  • Après quelques recherches, je vois que cela pourrait venir du datatype de ma colonne qui est au format image, alors qu'à priori, il vaudrait mieux qu'elle soit au format varbinary ; à cause de ça ma picturebox considère mon image comme non valide, qu'en pensez-vous ? et comment contourner ce pb finalement ? car évidemment je ne peux changer le type de ma colonne
    mardi 19 septembre 2017 08:28
  • Pour ceux qui pourraient rencontrer le même souci que moi, j'ai réussi à m'en sortir ainsi :

    J'ai viré le DataReader et remplacé ça :

    Dim bytBLOBData(dr.GetBytes(0, 0, Nothing, 0, Integer.MaxValue) - 1)AsByte dr.GetBytes(0, 0, bytBLOBData, 0, bytBLOBData.Length)

    par :

    Dim bytBLOBData()AsByte = DirectCast(document.ExecuteScalar(), Byte())

    et c'est ok.

    jeudi 21 septembre 2017 06:32
  • Bonjour rocketter,

    Je vous remercie d'avoir partagé cette solution avec la communauté du forum.
    Bonne journée.

    Cordialement,
    Teodora


    Votez! Appel à la contribution TechNet Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    jeudi 21 septembre 2017 08:35
    Modérateur