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

SQL Firebird Discussion :

FB 2.5 convertir du binaire en varchar


Sujet :

SQL Firebird

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut FB 2.5 convertir du binaire en varchar
    Bonjour les gens

    J'ai une table avec une colonne BLOB SUB_TYPE 0 et je cherche une syntaxe SQL (si ça existe) pour convertir le contenu en varchar.
    Le "CAST" simple déclenche une erreur à la compilation puor cause de conversion impossible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cast(photos.photo) as varchar
    Est-ce qu'il y a une façon de faire ça svp ?

    Papy !

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    ben déjà ton code pêche !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cast(photos.photo  AS varchar(2024) ) as photo
    je doit avouer ne pas avoir essayé, le(s) problème(s) que tu risques de rencontrer
    - string truncation si la taille du varchar n'est pas assez importante (je n'ai pas la taille max d'un varchar en tête le matin de bonne heure)
    - perte de donnée si un /00 se trouve dans le mémo
    [Edit] pour éviter ce deuxième point , l'utilisation d'un CHAR à la place d'un VARCHAR pourrait fonctionner

    en admettant que par exemple tu ne veuilles que récupérer l'entête de la photo l'utilisation de la fonction [URL="http://www.firebirdsql.org/refdocs/langrefupd21-intfunc-substring.html"][SUBSTRING (à consulter c'est peut être le bon choix plutôt qu'un CAST)/URL] s’avérera utile
    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

  3. #3
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par Papy214 Voir le message
    Est-ce qu'il y a une façon de faire ça svp ?
    En créant une UDF qui permettrait d'éviter et/ou de contourner les bizarerries évoquées par SergioMaster...
    Philippe.

  4. #4
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    ... Que mon "code pêche", ça, j'en avais bien conscience

    Pour la taille je pensais effectivement mettre un max mais sans être sur que ça passe à chaque fois.

    En fait, j'ai 2 tables.
    La première contient les données d'une ligne de traitement sous la forme Clé/Nom/Valeur.
    La seconde contient de 0 à 4 photos pour chaque ligne Clé/Index/Photo.
    J'utilise cette base dans un programme écrit en Delphi.
    La première solution consiste à récupérer les les données, puis dans un second temps, les photos que je transcris en chaîne grâce aux fonctions fournies par les composants UIB.
    La seconde consistait à faire 2 select avec un union pour récupérer le tout en une seule requête. C'est pour ça que je cherchais une solution de ce coté là.

    Les UDF sous Firebird, jamais fait encore. D'ailleurs, les UDF standards, ça s'installe comment avec un Firebird embeded dans Flamerobin par exemple ?

    Sinon, pour mon problème, je resterai temporairement à 2 requêtes pour ne pas retarder le projet.

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    La question reste : pourquoi vouloir transformer des datas images en data 'string' ?
    un Blob (image ou pas) se charge très facilement dans un Stream , il doit même y avoir une FAQ Delphi à ce sujet
    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

  6. #6
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    pourquoi du binaire ? euhh ... bonne question

    La base est utilisée en locale (embeded).
    Les données de l'image sont destinées à être envoyées ensuite à un service web sous forme de chaîne encodée en base64 (il y a peut-être d'autres solutions mais le boss a dit de faire comme ça).
    Je les stocke comme ça dans la base. Comme je suis pas trop doué avec firebird, j'ai créé une colonne de type blob sans me poser trop de question.
    Mais la question de Sergio m'a poussé à aller voir un peu plus loin que le bout de mon nez.
    Je viens de voir qu'il y a un type string pour les blob.
    Si j'utilise ce type de blob, est-ce que ça va résoudre mon problème ?

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Je crois que je commence à comprendre l'objectif . Mais je ne crois pas par contre que récupérer l'image en chaine de caractères soit la solution pour encoder l'image en 64 bits . A mon avis il faut récupérer le blob normalement dans un stream et encoder ce dernier (ou alors encoder directement dans la SGBD)
    par contre le comment , je n'en ai pas la moindre idée en cet instant
    La question se résumerai plutôt à comment encoder une image en 64bits. et comme en ce moment mon PC est en train de me lâcher (enfin son ventilo) je suis out of order
    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

  8. #8
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    Le système fonctionne bien dans l'ensemble, si ce n'est que la chaîne encodée est plus volumineuse que le binaire.
    Je verrai les améliorations dans le futur.

    Quand au pc qui lâche, mon conseil: lui servir un grand gin tonic glacé

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Quand au pc qui lâche, mon conseil: lui servir un grand gin tonic glacé
    le gin arrive dans un délai de 7 jours la glace est déjà au congélo
    et actuellement je travaille sur un pc de 'substitution' et la chose n'est pas facile (7 ans d'environnements à refaire)

    n'empêche , je serais bien intéressé par la manière d'encoder en 64bits (j'ai vu des moyens de le faire par Internet mais aucune méthode écrite ou ne serait-ce que décrite, peut être la faute a un écran plus petit pour mes recherches)
    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

  10. #10
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    Voici les différents codes que j'utilise

    Version Firemonkey

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    {$REGION 'Conversion d''un bmp en string et inversement'}
     
    function BitmapToBase64(ABitmap: Fmx.Types.TBitmap): AnsiString;
    var
      Stream: TMemoryStream;
    begin
      Stream := TMemoryStream.Create;
      try
        ABitmap.SaveToStream(Stream);
        Result := Soap.EncdDecd.EncodeBase64(Stream.Memory, Stream.Size);
      finally
        Stream.Free;
      end;
    end;
     
    function Base64ToBitmap(const S: AnsiString): Fmx.Types.TBitmap;
    var
      Stream: TMemoryStream;
      V: TArray<System.Byte>;
    begin
      V := Soap.EncdDecd.DecodeBase64(S);
      Stream := TMemoryStream.Create;
      Stream.Write(@V[0], Length(V));
      Result := Fmx.Types.TBitmap.Create(200, 200);
      try
        Result.LoadFromStream(Stream);
      finally
        Stream.Free;
      end;
    end;
     
    function BitmapToBase64Image(Bitmap: Fmx.Types.TBitmap; const Extension: string)
      : AnsiString;
    var
      S: TMemoryStream;
    begin
      S := TMemoryStream.Create;
      with TBitmapCodecManager.Create do
      begin
        SaveToStream(S, Bitmap, Extension);
        Free;
      end;
      Result := Soap.EncdDecd.EncodeBase64(S.Memory, S.Size);
      S.Free;
    end;
     
    function BitmapToBase64JPG(Bitmap: Fmx.Types.TBitmap): AnsiString;
    begin
      Result := BitmapToBase64Image(Bitmap, 'jpg');
    end;
     
    function BitmapToBase64PNG(Bitmap: Fmx.Types.TBitmap): AnsiString;
    begin
      Result := BitmapToBase64Image(Bitmap, 'png');
    end;
     
    {$ENDREGION}
    VCL
    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
     
    {$REGION 'Converstion d''une chaîne en png'}
     
    function Base64ToPNG(const S: AnsiString): TPNGImage;
    var
      Stream: TMemoryStream;
      V: TArray<System.Byte>;
    begin
      V      := EncdDecd.DecodeBase64(S);
      Stream := TMemoryStream.Create;
      Stream.Write(@V[0], Length(V));
      Stream.Seek(0, 0);
      result := TPNGImage.Create;
      try
        result.LoadFromStream(Stream);
      finally
        Stream.Free;
      end;
    end;
     
    {$ENDREGION}

Discussions similaires

  1. Réponses: 6
    Dernier message: 19/01/2007, 14h21
  2. Réponses: 3
    Dernier message: 09/05/2006, 14h35
  3. [C++.Net] convertir du binaire en hexadecimal
    Par lowrider dans le forum MFC
    Réponses: 2
    Dernier message: 01/05/2006, 14h53
  4. Convertir du binaire en Ascii
    Par brute dans le forum MFC
    Réponses: 2
    Dernier message: 28/12/2005, 09h20

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