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

Développement SQL Server Discussion :

Insérer une image JPG dans une table


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 125
    Points : 66
    Points
    66
    Par défaut [Résolu] Insérer une image JPG dans une table
    Bonjour,

    J'ai une table TOTO qui est définie comme ceci :
    - Nom_Fichier (Varchar (50))
    - Date_photo (DateTime)
    - Photo (Blob).

    Je remplis la table (sauf l'image) au moyen d'un import à partir d'un fichier Excel.

    Je voudrais importer les images JPG dans la table, en utilisant le champ Nom_fichier pour savoir quel fichier importer.

    Un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Update TOTO 
    set Photo = Load (Nom_Fichier.jpg) 
    where Nom_Fichier = Nom_Fichier.jpg and Photo is not null;
    Est-ce que c'est possible, et si oui, comment faire ?

    Merci d'avance.

    PS : avant de poser la question, j'ai cherché, mais ce que j'ai trouvé faisait référence à un truc appelé TextCopy, mais qui visiblement n'existe pas/plus sur SQL Server 2005 :
    http://www.mssqlcity.com/Articles/KnowHow/Textcopy.htm

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 561
    Points
    52 561
    Billets dans le blog
    5
    Par défaut
    Vous n'avez pas dit avec quelle version de SQL Server. Avec 2008 utiliser un type filestream.

    a +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 125
    Points : 66
    Points
    66
    Par défaut
    Pardon, c'est avec SQL Server 2005.

    Merci

  4. #4
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 756
    Points : 2 990
    Points
    2 990
    Par défaut
    Personellement, je n'ai pas encore saisi la valeur ajoutée de procéder de la sorte.

    Je m'explique : si tu stockes l'image sur un serveur accessible à tes utilisateurs, ton application recevrait de ta DB le chemin vers l'image et l'application n'aura qu'à charger cette dernière.

    Ce faisant, les images restent accessibles à d'autres applications comme par exemple des programmes de retouches d'images, à Windows Explorer pour la maintenance (suppression / remplacement par une nouvelle image / ...), ...

    Ceci est toutefois un avis à chaud.

    Saurais-tu m'éclairer en me disant les raisons qui te poussent à agir de la sorte ?

    Merci
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 125
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par cavo789 Voir le message
    Saurais-tu m'éclairer en me disant les raisons qui te poussent à agir de la sorte ?
    Avec plaisir.

    J'utilise un programme pour mon boulot qui crée puis utilise une base SQL Server. Je ne suis donc pas completement maitre des champs qu'il créée.

    En temps normal, tout le travail se fait par le programme, et l'utilisateur ne voit pas du tout la base SQL qui est derrière.
    Par exemple, pour l'importation des données, tout se fait dans le programme.

    Mais ce programme a ses limites, l'une d'elles étant l'impossibilité de faire une importation en masse d'images.

    Pour contourner cette limitation, j'ai donc pensé à utiliser SQL Server.

    L'idée est que l'utilisateur fait son importation en 2 parties :
    - Les données texte avec le programme
    - les photos avec SQL Server.

    Je voulais donc que dans les données texte qu'il importe, il y ait le nom du fichier image (toto.jpg)
    Ensuite (par exemple au moyen d'une procédure qui se lance à la demande, ou automatiquement), l'image est insérée dans la table.

    C'est aussi pour ça que je ne peux pas utiliser un lien vers l'image (car elle doit être stockée dans la base SQL Server pour pouvoir être affichée dans le programme).

    Donc, voilà la raison du pourquoi.

    J'espère avoir été clair et avoir répondu à vos interrogations.

  6. #6
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 756
    Points : 2 990
    Points
    2 990
    Par défaut
    Citation Envoyé par jjcasalo Voir le message
    Donc, voilà la raison du pourquoi.
    Oui, merci.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 561
    Points
    52 561
    Billets dans le blog
    5
    Par défaut
    Le seul moyen est de passer par du streaming binaire donc de développer une application...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 125
    Points : 66
    Points
    66
    Par défaut
    Bon, en fait, j'ai trouvé.

    J'ai creusé un peu plus l'utilisation de TextCopy (qui n'est présent que sur SQL Server 2000, mais qui fonctionne très bien sur SQL 2005).

    Cet utilitaire permet d'insérer une image (ou plus généralement un fichier binaire) dans un champ d'une table.

    Donc, ce que j'ai fait, c'est ça :
    1) Création d'une procédure stockée qui appelle TextCopy avec des paramètres.
    2) Création de la procédure stockée principale qui fait :
    ___a) je regarde tous les enregistrements avec le champ image vide
    ___b) j'insère une valeur non nulle dans ce champ (sinon, TextCopy plante)
    ___c) j'appelle la proc SP_TestCopy en lui passant en paramètre le nom du fichier image à aller insérer dans la table

    Et ca fonctionne très bien.

    Le code :
    Code : 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
    28
    29
    30
    31
    32
    33
     
    -- Description:	<Utilisation de TextCopy pour importer une image dans un champ>
     
     CREATE PROCEDURE [dbo].[sp_textcopy] ( 
      @srvname     varchar (50),
      @login       varchar (50),
      @password    varchar (50),
      @dbname      varchar (50),
      @tbname      varchar (50),
      @colname     varchar (50),
      @pathname    varchar (100),
      @filename    varchar (50),
      @whereclause varchar (100))
    AS
    DECLARE @exec_str varchar (1000)
     
    BEGIN
    	SET NOCOUNT ON;
     
    	SELECT @exec_str = 
             'textcopy /S ' + @srvname +
             ' /U ' + @login + 
             ' /P ' + @password + 
             ' /D ' + @dbname +
             ' /T ' + @tbname + 
             ' /C ' + @colname + 
             ' /W "' + @whereclause + '"' +
             ' /F ' + @pathname + @filename + 
             ' /I '  
     
    	-- Execute la commande TEXTCOPY avec les parametres.
    	EXEC master..xp_cmdshell @exec_str
    END
    Code : 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    -- Description:	<Permet d'importer des photos dans une base iBase>
     
    CREATE Procedure [dbo].[Importe_Photo] AS
     
    DECLARE
    	@StrSQL  Varchar (1000),		-- Texte de la requete dynamique
    	@NomFichier  Varchar (50),	-- Nom du fichier image
    	@TmpStr Varchar (100)
     
    DECLARE CursBase CURSOR FOR
    SELECT Nom_Fichier FROM TEST_PHOTO WHERE C_Photo is null
     
    OPEN CursBase
    FETCH CursBase INTO @NomFichier
     
    WHILE @@Fetch_Status = 0
    BEGIN
    	-- On commence par renseigner le champ C_Photo avec une valeur non nulle,
    	-- car TextCopy n'accepte pas d'insérer une image dans un champ vide
    	SET @StrSQL = 'Update TEST_PHOTO' +
    			' Set C_Photo = 0x0 where Nom_Fichier = ''' + @NomFichier + ''''
    	EXEC (@StrSQL)
     
    	-- On peut maintenant appeler la procédure sp_TextCopy
    	SET @TmpStr = 'WHERE Nom_Fichier = ''' + @NomFichier + ''''
     
    	EXEC sp_textcopy @srvname = 'SERVEUR_SQL', 
    				@login = 'sa', 
    				@password = 'mot_de_passe_sa', 
    				@dbname = 'Test_Import_PHOTO', 
    				@tbname = 'TEST_PHOTO',
    				@colname = 'C_Photo', 
    				@pathname = 'C:\Temp\', 	-- ATTENTION : le chemin ne doit pas comporter d'espace ! ! 		
    				@filename = @NomFichier ,
    				@whereclause = @TmpStr
     
    	-- Lecture de la ligne suivante
    	FETCH CursBase INTO @NomFichier
    END
     
    CLOSE CursBase
    DEALLOCATE CursBase
    Les images doivent être dans le répertoire C:\Temp.

    La structure de la table TEST_Photo est la suivante :
    - Nom_Fichier Varchar(50) (clé primaire)
    - Date_Photo DateTime
    - C_Photo Picture


    Voilà, si ça peut aider quelqu'un.

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

Discussions similaires

  1. Charger une image JPG dans une fiche - ADO/Delphi
    Par tleboukaka dans le forum Bases de données
    Réponses: 4
    Dernier message: 11/05/2010, 16h20
  2. Réponses: 0
    Dernier message: 07/06/2009, 12h31
  3. Réponses: 4
    Dernier message: 19/06/2008, 15h41
  4. position dans une image (selection dans une image)
    Par kaiseresis dans le forum Images
    Réponses: 3
    Dernier message: 31/05/2008, 13h30
  5. Copier une image jpg dans une cellule dun DrawGrid
    Par ero-sennin dans le forum Delphi
    Réponses: 13
    Dernier message: 10/07/2007, 15h57

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