Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

STOCKER DES IMAGES DANS SQL SERVER


Information sur la source

Catégorie :Base de Donnees Source .NET ( DotNet ) Niveau : Débutant Date de création : 02/04/2004 Date de mise à jour : 28/05/2004 09:21:05 Vu : 11 898

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

Description

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

  • 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
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 :).
 

Commentaires et avis

signaler à un administrateur
Commentaire de DocteurVB le 02/04/2004 12:48:12

est ce que c'est possible de faire la même chose avec MySql ???

signaler à un administrateur
Commentaire de Lumpy__ le 02/04/2004 13:50:27

En théorie ça devrait pas poser de problème. En fait, il suffit de remplacer le type de champs image par un blob en mysql et d'utiliser la librairie .net pour mysql (je n'ai qu'une version beta mais ça a l'air de fonctionner).

signaler à un administrateur
Commentaire de Didchr81 le 03/04/2004 08:39:31

Salut!

J'utilise moi même la fonction Blob sur SQL depuis un ans maintenant sur une table qui contient 12000 enregistrements à ce jour. l'Appli tourne notamment en environnement TSE, avec un code plus pointu, car je dois enregistré l'image mais aussi la restaurer pour une visualisation. Cette appli est trop grosse pour la mettre sur ce site, mais si quelqu'un est intéressé par le module Image, je peux lui donné.

Salutations !  

signaler à un administrateur
Commentaire de bouv le 05/04/2004 14:53:16

Salut Didchr81,

Tom module image m'interresse. Je suis en train de faire un petit logiciel de facturation et j'aimerai pouvoir insérer des images pour les articles en vente.

Peut tu m'envoyer ton module.

decf20012003@free.fr

Merci par avance et bonne progz

Bien Cordialement

signaler à un administrateur
Commentaire de lulu1708 le 09/11/2004 18:49:56

salut  Lumpy,

j'ai une erreur qui est générée :
Paramètre non valide utilisé.
Description : Une exception non gérée s'est produite au moment de l'exécution de la demande Web actuelle. Contrôlez la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.

Détails de l'exception: System.ArgumentException: Paramètre non valide utilisé.

Trace de la pile:


[ArgumentException: Paramètre non valide utilisé.]
   System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement) +309
   System.Drawing.Image.FromStream(Stream stream) +7
   WebApplication1.test.Page_Load(Object sender, EventArgs e) in c:\inetpub\wwwroot\WebApplication1\test.aspx.vb:44
   System.Web.UI.Control.OnLoad(EventArgs e) +67
   System.Web.UI.Control.LoadRecursive() +35
   System.Web.UI.Page.ProcessRequestMain() +731


Et je n'arrive pas à résoudre ce Problème.
Pourrait-tu m'aider ??

Merci

lulu

signaler à un administrateur
Commentaire de Lumpy__ le 10/11/2004 10:16:02

envoie moi le bout de code source qui déraille à : ps1k0@msn.com

Je vais voir ce que je peux faire.

a++

lUMPY

signaler à un administrateur
Commentaire de ekluska le 16/11/2005 12:14:51

bonjour,
j'ai le meme probleme avec ce fameux message "parametre non valide utilisée"
Est ce que quelqu'un a trouvé la solution

merci pour toute l'aide apportée

a++

signaler à un administrateur
Commentaire de solochiz1 le 28/03/2006 00:08:08

lorsque j'execute voila l'erreur du NonQuery :
Operand type clash: image is incompatible with bit
j'ai pas compris ou est l'imcompatibilité
je travaille avec studio 2005

signaler à un administrateur
Commentaire de babchrist le 27/02/2007 17:23:12

Lumpy__

Bonjour moi c'est Babchrist. J'ai vu ton code il bien mais je voudrais un peu la même chose en VB6. En fait je cherche un petit code qui va permettre d'enregistrer une image dans une base sql server et si possible qui va encore me permettre de reconstituer cette image enregistrée dans la base, en fichier BMP ou JPG. Merci de m'aider.

Babchrist.


signaler à un administrateur
Commentaire de PhilippebedinCS le 04/04/2007 01:04:15

Bonjour, j'ai testé ton code car j'avais trouvé un jour le m^me genre de truc mais avec ACCESS; le problème ici c'est que tout semble fonctionner avec ton code (que j'ai légèrement adapté à une table sql perso) sauf que ça n'enregistre rien dans ma table... voici mon code :

Imports System.Data
Imports System.Data.SqlClient
Public Class Form1
    Public Const MAX_IMAGE_SIZE As Long = 32768
    Public picture As Image = My.Resources.Resource1.chevaux1
    Public myconnexion As New SqlConnection
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'TODO : cette ligne de code charge les données dans la table 'Database1DataSet.JockeysPlat'. Vous pouvez la déplacer ou la supprimer selon vos besoins.
        Me.JockeysPlatTableAdapter.Fill(Me.Database1DataSet.JockeysPlat)

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' 32 Ko

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

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

        myconnexion.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True"

        myconnexion.Open()
        myCmd = New SqlClient.SqlCommand("insert into JockeysPlat values (@nom,@Idimg,@Portrait)", myconnexion)
        If Not picture.Equals(Nothing) Then
            picture.Save(ms, System.Drawing.Imaging.ImageFormat.Gif)
            If ms.Length > MAX_IMAGE_SIZE Then
                MsgBox("TROP GRANDE")
            End If
            arrPicture = ms.GetBuffer()
            myCmd.Parameters.Add("@Portrait", SqlDbType.Image).Value = arrPicture
        Else
            myCmd.Parameters.Add("@Portrait", SqlDbType.Image).Value = DBNull.Value
        End If
        myCmd.Parameters.Add("@nom", SqlDbType.Char).Value = "image1"
        myCmd.Parameters.Add("@Idimg", SqlDbType.Int).Value = 0
        MsgBox(myCmd.ExecuteNonQuery())
        Stop
        myconnexion.Close()
    End Sub
        '        
End Class

Ma table reste imperturbale...
Il est vrai que je débute en SQL et que ces histoires de variables paramétrées...
As-tu une explication . Merci.

signaler à un administrateur
Commentaire de garnier54 le 30/11/2007 11:04:02

bonjour

merci tout d'abord pour ton code j'ai essayer de le tester suis en vs2005 web express et je rencontre qq problemes

sur picture.save il ne sort une erreur
save is not a menber of system.web.ui.webcontrols.image
meme probleme pour image.FromStream

merci de votre aide

signaler à un administrateur
Commentaire de aitoz le 02/10/2008 15:20:35

Bonjour,

J'ai la même erreur qui est générée : Paramètre non valide utilisé.
Cela doit venir de la taille du buffer. l'image ne fait pas tjs le même poids (Ko) et peut-être que ca vient de ça ?!

Est-ce que vous pouvez m'aider ?

Merci A+

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,265 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.