Stocker des images dans sql server

Contenu du snippet

Beaucoup de gens m'ont posé la question, "mais comment tu enregistres et relis des images dans ta base ?". Bien que cela ne me semblait pas trop compliqué, je vais l'expliquer ici. C'est peut-être pas exactement 'la bonne méthode', mais bon, vous en faites ce que vous voulez.

Pour cet exmple, imaginez une table dans sql server de type :
matable
{
ID (entier)
NOM (chaine)
IMAGE (image)
}
Ainsi qu'un connexion valide et une image nommée picture (comme c'est original).

Source / Exemple :


Public Const MAX_IMAGE_SIZE As Long = 32768    ' 32 Ko

' ----------------------------------------------------------------------------------------
' Ajout d'un enregistrement
' ----------------------------------------------------------------------------------------

Dim myCmd As SqlCommand
Dim ms As New System.IO.MemoryStream
Dim arrPicture() As Byte

myCmd  = New SqlCommand("insert into matable values (@id, @nom, @image)", myConnection)
if not isnothnig(picture)
    picture.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg)
    If ms.Length > MAX_IMAGE_SIZE Then 
        ' Image trop grosse
    end if
    arrPicture = ms.GetBuffer()
    myCmd.Parameters.Add("@image", SqlDbType.Image).Value = arrPicture
Else
    myCmd.Parameters.Add("@image", SqlDbType.Image).Value = DBNull.Value
End If
myCmd.Parameters.Add("@id", SqlDbType.Int).Value = 0
myCmd.Parameters.Add("@nom", SqlDbType.Char).Value = "image1"
myCmd.ExecuteNonQuery()

' ----------------------------------------------------------------------------------------
' Lecture d'un enregistrement
' ----------------------------------------------------------------------------------------

Dim myCmd As SqlCommand
Dim reader As SqlDataReader
Public picture As Image

myCmd  = New SqlCommand("select * from matable", myConnection)
reader = myCmd.ExecuteReader()
while reader.read
    ' Traitement des autres champs ... puis :
    If Not reader.IsDBNull(2) Then
        Dim arrPicture(MAX_IMAGE_SIZE) As Byte
        reader.GetBytes(2, 0, arrPicture, 0, MAX_IMAGE_SIZE)
        Dim ms As New System.IO.MemoryStream(arrPicture)
        picture = [Image].FromStream(ms)
        ' Ici on peu appliquer n'importe quel traitement à l'objet picture
        ' comme par exemple le stocker dans un tableau ou l'afficher
        ' dans un picturebox etc ...
    End If    
end while

Conclusion :


Bon, pour bien faire faudrait faire ça dans un try ... catch, mais la c'est du code de démo hein ...
J'ai volontairement autorisé une image 'assez conséquente' - Remplissez un table de cette manière et testez poure vous rendre compte du coût de performance que peut avoir ce genre de manipulations. Voila, esperant que ça suffira à ceux qui cherchaient :).

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.