12
votes

Quel type de variable dois-je utiliser pour enregistrer une image?

Je vais enregistrer des images dans une base de données SQL (ne sais pas quel type à utiliser), et je vais interroger la base de données pour une image d'un coup de portrait des étudiants.

Quelle variable Tapez Devrais-je utiliser pour stocker cette image? P>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Nana_s_Student_Gradebook
{
    class Student
    {
        public string name { get; set; }
        public string lastName { get; set; }
        public byte[] picture { get; set; }
        public DateTime dateOfBirth { get; set; }
    }
}


0 commentaires

4 Réponses :


9
votes

Dans votre code .NET, vous voudrez probablement utiliser system.drawing.image ou une classe dérivée. En fin de compte, vous devrez diffuser ces octets sur SQL Server d'une manière ou d'une autre, mais vous n'avez pas besoin d'utiliser un tableau d'octets depuis le début. Tous les types d'image liés à .NET offrent une sorte de support en continu.

sur le côté SQL Server, par tous les moyens, utilisez un type varbinary (max) type - c'est binaire, c'est jusqu'à 2 Go de taille, il est rapide, il est parfait pour ce cas d'utilisation. Jusqu'à une taille d'image moyenne d'environ 1 Mo, c'est probablement votre meilleur choix - encore mieux que d'utiliser l'attribut SQL Server 2008 FileStream (qui est génial si vous avez beaucoup de très grandes images, plus grandes moins de 1 Mo sur une base régulière; ici, le fichier binaire est lui-même stocké dans le système de fichiers de la machine serveur sous contrôle de la base de données).


2 commentaires

Je crée ma candidature à l'aide de WPF; L'utilisation d'un espace de noms doit être: à l'aide de System.Drawing; droite?


@Sergio: Oui, la classe image est dans System.Drawing.



1
votes

système.drawing.image ou < Un href = "http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx" rel = "Nofollow Noreferrer"> System.Drawing.bitmap


3 commentaires

Pouvez-vous les sauvegarder dans un DB? Vous n'avez pas besoin de l'enregistrer à un octet [] d'une manière ou d'une autre?


Oui, je devrais d'abord changer mon image en une matrice d'octet [] avant de la passer à ma dB.


J'étais plus préoccupé par la structure de données que vous avez présentée. Une fois que vous avez lu les octets de la base de données, j'utiliserais la méthode image.fromstream () à lire dans les octets (à l'aide d'un flux de mémoire ou d'un équivalent). Pour le stockage de la DB, vous pouvez écrire l'image à des octets. Mais pour la logique interne, je ne voudrais pas porter autour d'un tableau d'octets. C'est d'une utilisation limitée.



1
votes

Vous avez raison - utilisez un tableau d'octets dans votre classe. Pour les images inférieures à 1 Mo, utilisez une colonne Varbinary (Max) dans SQL Server. Si les images sont supérieures à 1 Mo et que vous utilisez SQL Server 2008, envisagez d'utiliser une colonne FileStream.

Vous pouvez utiliser le graphique sur Cette page MSDN pour se référer aux mappages de type de données C # / SQL.


0 commentaires

1
votes

envisagez de stocker l'image en tant que fichier, puis de référencer le nom de fichier dans la DB et non les données binaires elles-mêmes. Cela présente plusieurs avantages, tels que vous permettant de stocker des images sur d'autres serveurs et de réduire la charge / la circulation sur le serveur SQL.


0 commentaires