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

 Delphi Discussion :

copier image d'une table sql dans une autre


Sujet :

Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Points : 133
    Points
    133
    Par défaut copier image d'une table sql dans une autre
    (delphi 2006) - sqlserver 2000 2008 - ADO

    bonjour

    j'essaie de copier une image d'une table dans un variant pour ensuite copier cette image dans un autre table
    je copie pas directement l'image d'une table a une autre par requete car ce n'est pas mon besoin


    ce n'est pas le vrai code, c'est juste pour avoir un exemple

    pour lire l'image je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    temp_photo : variant;
     
    procedure lire;
    var  Query : TADOquery;    
    begin
        Query := TADOquery.Create(nil);
        Query.connection:= ...
        Query.sql.text := 'SELECT mon_image FROM matable';
        Query.open;
        temp_photo  := Query['mon_image'];
        showmessage(inttostr(length(temp_photo)));
        Query.free;
    end;

    pour lire l'image je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure ecrire;
    begin
      With TADOQuery.Create(nil) do
      begin
        Connection :=.....
        Sql.add('Insert into ma_nouvelle_table Values(:1,.....)');
        Parameters.ParamByName('1').Value  :=temp_photo;
        ExecSQL;
        free;
      end;
    end;
    le probleme, c'est que lorsque je fais la requete dans "Microsoft SQL server management studio express"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT datalength(mon_image) FROM matable
    j'ai une taille de 10000 pour l'image , le showmessage de la procedure lire me donne aussi 10000
    mais quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT datalength(mon_image) FROM ma_nouvelle_table
    j'ai une taille de 20000 pour l'image (le double)

    je me demande du coup si c'est pas a cause de ça si je vois pas mon image dans mon rapport (crystal report) ?
    question subsidiaire : vous connaissais pas un editeur sql gratuit ou on peut voir les images au lieu de voir System.Byte[] .... (comme faisait l'editeur paradox par exemple)


    merci

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 409
    Points : 5 799
    Points
    5 799
    Par défaut
    salut

    pour charger une image ou un fichier dans la base je passe par un fichier temporaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaQuery_BLOB.loadfromfile(NomDeFichier)
    et pour l'afficher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      MaQuery_BLOB.SaveToFile(NomDeFichier);
    ..
      MonImage.loadfromfile(NomDeFichier)
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Points : 133
    Points
    133
    Par défaut
    merci pour ta réponse
    mais, passer par un fichier temporaire n'est pas très pratique pour mon utilisation, il me faut une variable...

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 409
    Points : 5 799
    Points
    5 799
    Par défaut
    salut

    autre solution purement sql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    st := ' insert into Table2(....) '
    +' select .... '
    +' from Table1 '
    +' where ID = %d  ';
     
    MaQuery.Sql.clear;
    MaQuery.Sql.add(Format(st,[MonId]));
    MaQuery.ExecQuery;
    normalement les éléments devrais être les meme
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Points : 133
    Points
    133
    Par défaut
    oui mais non..
    la lecture de ma table et l’écriture ne se font pas au même moment, je dois stocker les données de plusieurs bases et les trifouiller puis a la fin ecrire les résultats qui m’intéressent .

    ce qui est bizarre, c'est qu'il y a longtemps, ça marchait... mais j'ai du changer le code....

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 409
    Points : 5 799
    Points
    5 799
    Par défaut
    ta variable c'est quoi ? un string ?
    si c'est ça, c'est peut être un problème d’Unicode ?
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Points : 133
    Points
    133
    Par défaut
    la variable c'est temp_photo : variant;

  8. #8
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 409
    Points : 5 799
    Points
    5 799
    Par défaut
    salut,

    arf j'aime pas les variants;

    regardons ce que nous fournis les variants

    STRING REEL INTEGER BOOLEAN

    Les variants peuvent contenir des tableaux variants de différentes tailles, dimensions et types de base. Les éléments d'un tableau variant peuvent être de n'importe quel type admis dans les variants sauf ShortString et AnsiString. De plus, si le type de base du tableau est Variant, ses éléments peuvent même être hétérogènes. Utilisez la fonction VarArrayRedim pour redimensionner un tableau variant. Les autres routines standard agissant sur les tableaux variants sont VarArrayDimCount, VarArrayLowBound, VarArrayHighBound, VarArrayRef, VarArrayLock et VarArrayUnlock.
    le soucis étant, que tout ceci est complètement opaque.
    On ne vois pas si le fichier est mis dans un type string ou dans array of integer ou autre.
    pour le coup tu ne maîtrise pas complètement ce que tu fait
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Points : 133
    Points
    133
    Par défaut
    moi non plus j'aime pas.
    j'ai mis juste pour ce cas pour stocker les images de ma base de données en attendant de les copier plus tard

    mais si y'a mieux j'suis preneur

  10. #10
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 409
    Points : 5 799
    Points
    5 799
    Par défaut
    salut

    utilisation de table temporaire
    je ne sais pas ce que tu fais avec tes tables mais je préfère faire bosser mon serveur que le poste client ^^
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    j'ai suivi ce fil de discussion sans vraiment arrivé à comprendre l'objectif
    selon le titre il s'agissait de Copier une image contenu dans une table ,<-- là déjà j'ai fini par comprendre qu'il ne s'agissait pas du nom du fichier (le contenant) mais du contenu, et ce vers une autre table et ce en utilisant du SQL.
    Du coup le sujet m'intéresse, mais par la suite, que lis-je? (à part la solution "classique" d'utilisation du stream) une butée sur une valeur de taille retournée entre, si j'ai bien compris, la valeur retournée en utilisant les composants ADO et un GUI "Microsoft SQL server management studio express".
    La taille de quoi ? la taille de l'image (contenu) ou la taille du buffer utilisé pour l'image : telle est la question

    Je ne connais pas SQL Server (du moins je ne maitrise pas) dans mon esprit un Blob Binaire (est-ce que je me trompe ?)
    un des propos du Blob du moins dans les SGBD que je maitrise est de ne pas forcément être stocker dans la table (au sens strict du terme) mais plutôt sous la forme d'un pointeur et d'une longueur et c'est la tache d'une API (donc quelque part du composant l'utilisant) que de récupérer les informations contenu et ce en plusieurs passes si nécessaire, en cas de taille importante.

    AMHA la taille obtenue est donc fonction du paragraphe ci-dessus, soit de la taille de buffer utilisé par l'API, en tout cas cela ne donne pas la taille du contenu.

    La proposition purement SQL proposée par Anapurna ne me semble pas correcte, ce qui sera copié dans la table "réceptrice" sera non pas le contenu de l'image mais plutôt le couple pointeur+taille (en tout cas j'ai toujours eu une erreur sur mes blobs Firebird après ce genre de manipulation et ce quand il s'agissait de blob texte, je n'ose imaginer ce qu'il en serait d'un blob binaire)
    Dans le cas d'un blob texte inférieur à la taille maximale d'un VARCHAR (text) l'astuce en SQL est de passer par un CAST du champ en VARCHAR ce qui bien sûr est inenvisageable avec un champ en binaire.
    La seule solution consiste donc à passer par des streams (plutôt qu'un variant ou des fichiers temporaires) proposition également retenue ici, où j’apprends qu'il y a même un type Image avec SQL Server

    Donc, à mon avis (toujours théorique)
    il faut passer par un Stream (TMemoryStream par exemple) pour charger "l'image" pour obtenir la taille du contenu on pourra alors utiliser les fonctions du Stream (je pense par exemple à Seek(soEnd,0) )

    bien évidemment cela ne répondra pas à la question avec le GUI, ni à la question subsidiaire
    mais probablement à la question (j'ai l'humeur "corrective")
    je me demande, du coup, si ce n'est pas à cause de ça que si je vois pas mon image ne se voit pas dans mon rapport (crystal report) ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. Image stockée directement ou lien dans une table SQL
    Par Badouba76 dans le forum Requêtes
    Réponses: 4
    Dernier message: 07/11/2013, 17h56
  2. afficher une table sql dans une table control
    Par coucoulido dans le forum WinDev
    Réponses: 4
    Dernier message: 06/06/2011, 13h20
  3. Réponses: 3
    Dernier message: 20/12/2006, 18h59
  4. inserer les donnees d une feuille excel dans une table sql
    Par josyde2006 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 20/12/2006, 09h40
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 22h24

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