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 Presentation Foundation Discussion :

Champs SQL Server Binary (image) conversion LINQ-objet image


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut Champs SQL Server Binary (image) conversion LINQ-objet image
    Bonjour,

    j'ai une base SQL Server 2005 avec un champ Binary (type System.Data.Linq.Binary une fois dans mon DataClasses1.dbml).
    Lorsque je fais ma requête LINQ j'obtiens ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
               var query =
     
                    from pic in connect2Adventure.ProductPhotos
                    select pic.ThumbNailPhoto;
    Que dois je faire de mon objet LINQ, comment le convertir en objet métier C# et de quel type dois je l'utiliser ?
    Le type d'image semble être .gif

    Je pense que ça ne doit pas être compliqué mais je n'arrive pas à trouver de solution pour "caster" mon type object en image (d'ailleurs c'est quelle classe en WPF ?)

    Merci

  2. #2
    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 : 43
    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
    Par défaut
    Il faut que tu personnalises la classe générée par le designer LINQ (je suppose qu'elle s'appelle ProductPhoto). Comme la classe est déclarée comme partielle dans le fichier .designer.cs, tu peux la "compléter" en la redéclarant (toujours partielle) dans un autre fichier. Je te conseille de renommer la propriété ThumbNailPhoto en ThumbNailPhotoRaw, pour indiquer qu'il s'agit des données binaires brutes de l'image. Et tu rajoutes dans la classe une nouvelle propriété ThumbNailPhoto de type ImageSource (utilisé à la place de Image en WPF) avec le code suivant :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    namespace TonNamespace
    {
        public partial class ProductPhoto
        {
            public ImageSource ThumbNailPhoto
                get
                {
                    MemoryStream stream = new MemoryStream(ThumbNailPhotoRaw);
                    BitmapImage img = new BitmapImage();
                    img.BeginInit();
                    img.StreamSource = stream;
                    //img.CacheOption = BitmapCacheOption.OnLoad;
                    img.EndInit();
                    return img;
                }
                set
                {
                    MemoryStream stream = new MemoryStream();
                    BitmapImage img = value as BitmapImage;
                    JpegBitmapEncoder encoder = new JpegBitmapEncoder();
                    encoder.Frames.Add(BitmapFrame.Create(img));
                    encoder.Save(stream);
                    ThumbNailPhotoRaw = stream.GetBuffer();
                }
            }
        }
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut
    Merci ça me semble bien.
    J'avais aussi trouvé une solution mais différente, certainement moins propre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
            public Image byteArrayToImage(byte[] byteArrayIn)
            {
                MemoryStream ms = new MemoryStream(byteArrayIn);
                Image returnImage = Image.FromStream(ms);
                return returnImage;
            }
     
    Image imagetemp = byteArrayToImage(pic.ToArray());
    La conversion avait lieu ici après la récupération du Binary, ça doit rester proche

  4. #4
    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 : 43
    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
    Par défaut
    Oui, sauf que la classe Image que tu utilises ici est System.Drawing.Image, et WPF n'utilise pas cette classe. Les images à afficher dans une interface WPF (dans un contrôle System.Windows.Control.Image par exemple) sont de type ImageSource (beaucoup moins pratique à manipuler d'ailleurs...)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Par défaut
    Oui je suis d'accord et d'ailleurs à la ligne que tu m'as donné, il y a un problème de compilation, le constructeur semble prendre un entier.
    J'ai essayé en passant par un ThumbNailPhotoRaw.toArray(), ca passe en compil mais en exécution, exception.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                        MemoryStream stream = new MemoryStream(ThumbNailPhotoRaw);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Error	2	Argument '1': cannot convert from 'System.Data.Linq.Binary' to 'int'

  6. #6
    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 : 43
    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
    Par défaut
    Ah ok je vois... en fait j'ai tiré ce code d'un projet que j'avais fait, et je l'ai adapté à ton cas. Dans mon projet j'avais défini le champ de données brutes comme un tableau de byte et non comme un Binary. Ca devrait passer si tu fais comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MemoryStream stream = new MemoryStream(ThumbNailPhotoRaw.ToArray());

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Insert Into erreur "ODBC --Call Failed" avec un champ sql server Identify
    Par jayjazz dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 17/05/2011, 13h17
  2. crypter champs sql server
    Par fido1 dans le forum Développement
    Réponses: 4
    Dernier message: 25/08/2010, 12h41
  3. Réponses: 2
    Dernier message: 23/09/2008, 14h16
  4. SQL SERVER/DELPHI Erreur Conversion CHAR DATETIME
    Par Macadoshis dans le forum Bases de données
    Réponses: 7
    Dernier message: 13/06/2008, 12h52
  5. [SQL SERVER 2000] Probleme conversion en numeric !
    Par MeHo_ dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/03/2008, 12h13

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