IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Recuperation des valeurs d une colonne de type Image dans SQL Server


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 25
    Points : 16
    Points
    16
    Par défaut Recuperation des valeurs d une colonne de type Image dans SQL Server
    Bonjour

    Dans ma table, j'ai une colonne nommée "ImageKey" de type "Image".
    Pour enregistrer, je recupere d'abord l'image par le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Bitmap MyImage;
                openFileDialog1.InitialDirectory = "E:\\images";
                openFileDialog1.Filter = "Tous les fichiers images|*.jpg;*.bmp;*.tif;*.gif";
                openFileDialog1.Title = "Choisissez une ou plusieurs images à traiter";
                openFileDialog1.FileName = "";
                if (openFileDialog1.ShowDialog() != DialogResult.OK)
                    return;
     
                photo.SizeMode = PictureBoxSizeMode.StretchImage;
                photo.ClientSize = new Size(150, 150);
                photo.Image =Bitmap.FromFile(openFileDialog1.FileName);
               MyImage = new Bitmap(Bitmap.FromFile(openFileDialog1.FileName));
    puis j'enregistre la valeur de "MyImage" dans la base.

    Maintenant, je veux recuperer la valeur de cette colonne et l'afficher dans un pictureBox comme image.

    Merci de m'aider.

    cdt.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    Points : 456
    Points
    456
    Par défaut
    Sous SQL Serveur les images sont stockées dans un tableau de bit.
    Tu récupères la row de ta table ou simplement la valeur de ta colonne Image sous form de bit[] puis tu la transforme en Image.
    Il y a plusieurs façon de procéder, voici la première que j'ai trouvé dans google =D


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DataRow myRow = getMyRow(); // récuperation de la row
    byte[] b = (byte [])myRow["Image"];
    MemoryStream mem = new MemoryStream(b);
    pictureBox1.Image = Image.FromStream(mem);

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    La librairie Dvp.NET propose des méthodes d'extension qui peuvent être pratiques pour faire ce genre de chose :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    using (var command = connection.CreateCommand("SELECT LaColonne FROM LaTable WHERE ..."))
    using (var reader = command.ExecuteReader())
    {
        var row = reader.AsEnumerable().First();
        using (var stream = row.GetStream("LaColonne"))
        {
            pictureBox1.Image = Image.FromStream(stream);
        }
    }

    A noter que GetStream ne renvoie pas un MemoryStream dans lequel les données sont déjà chargées, mais un Stream spécifique qui lit les données à partir de la base et les renvoie au fur et à mesure, d'où une économie de mémoire.

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    while (drd.Read ())
                    {
                        if (drd["ImageKey"].ToString ()!=string .Empty )
                        {
                            photoagent = (byte[])(drd["ImageKey"]);
                            //ImageAgent = byteArrayToImage(photoagent);
                            MemoryStream ms = new MemoryStream(photoagent);
                            ms.Write(photoagent, 0, photoagent.Length);
                            ImageAgent = Image.FromStream(ms);
                            photo.SizeMode = PictureBoxSizeMode.StretchImage;
                            photo.ClientSize = new Size(150, 150);
                            photo.Image = ImageAgent;
                        }
                    }
    j'ai fait ce code mais l'erreur "Parametre non valide" est retourné à cette ligne en rouge.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    il ne faut pas faire le Write, le MemoryStream contient déjà les données puisque tu les a passées en paramètre du constructeur

  6. #6
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Bonjour

    Personellement j'ai toujours trouvé que ce n'etais pas une bonne idée de stocker des images en base de donnée. Ca allourdit beaucoup et c'est rarement vraiment justifé.

    Je prefere maitenir une table de reference et stocker les images en fichier séparés

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    Monsieur TomLev

    dans votre code, j'ai une erreur sur la première ligne

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    using (var command = connection.CreateCommand("SELECT LaColonne FROM LaTable WHERE ..."))

    Aucune surcharge pour la methode CreatCommand ne prend d'argument 1

    Qu'en pensez vous ?

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Citation Envoyé par papepapis Voir le message
    dans votre code, j'ai une erreur sur la première ligne

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    using (var command = connection.CreateCommand("SELECT LaColonne FROM LaTable WHERE ..."))

    "Aucune surcharge pour la methode CreatCommand ne prend d'argument 1"
    Tu as bien ajouté la référence à la librairie Dvp.NET ? Et le using qui va bien ?

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    using Developpez.Dotnet.Data;

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/05/2011, 10h00
  2. Réponses: 0
    Dernier message: 29/03/2010, 16h39
  3. Champ de type "Image" dans SQL Server
    Par Edouard Kaiser dans le forum ASP
    Réponses: 5
    Dernier message: 09/09/2005, 07h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo