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 :

TMemoryStream en Delphi 10.3.3


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Profil pro
    developpeur
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Bénin

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Points : 21
    Points
    21
    Par défaut TMemoryStream en Delphi 10.3.3
    Bonjour à tous, j'ai un petit souci avec l'utilisation du MemoryStream pour insérer une image bmp dans une table de ma base de données PostgreSQL 9.5
    Voici la structure de la table

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE utilisateur."UTILISATEUR"
    (
      "MOTPASS" character varying NOT NULL,
      "NOMUTI" character varying,
      "IMAGE" bytea,
      CONSTRAINT "UTILISATEUR_pkey" PRIMARY KEY ("MOTPASS")
    );

    Voici mon 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
    procedure TSIGNATAIRE.BitBtn1Click(Sender: TObject);
    var IMG:TBitmap;
          MS:TMemoryStream;
    begin
    MS:=TMemoryStream.Create;
    IMG:=TBitmap.Create;
    IMG.CleanupInstance;
    IMG.LoadFromFile('D:\SIGN.BMP');
    IMG.SaveToStream(MS);
    MS.position:=0;
     
    FDTable1.Edit;
    TBlobField(FDTable1.FieldByName('IMAGE')).LoadFromStream(MS);
    FDTable1.Post;
    end;
    Mais à l'exécution un méssage d'erreur s'affiche <<Transtypage de classe incorrect>>, veuillez m'orienter sur la source de l'erreur.
    Merci!

  2. #2
    Membre confirmé Avatar de blonde
    Femme Profil pro
    Développeur Delphi
    Inscrit en
    Septembre 2003
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Septembre 2003
    Messages : 278
    Points : 477
    Points
    477
    Par défaut
    Je suppose que la ligne impliquée est celle du TBlobField

    Essayez à la place :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FDTable1.FieldByName('IMAGE').LoadFromStream(MS,ftBlob)
    ne pas oublier MS.position := 0 après l'appel.

  3. #3
    Membre à l'essai
    Profil pro
    developpeur
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Bénin

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Points : 21
    Points
    21
    Par défaut
    D'accord je retoure à mon code rapidement pour la correction.

  4. #4
    Membre à l'essai
    Profil pro
    developpeur
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Bénin

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par blonde Voir le message
    Je suppose que la ligne impliquée est celle du TBlobField

    Essayez à la place :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FDTable1.FieldByName('IMAGE').LoadFromStream(MS,ftBlob)
    ne pas oublier MS.position := 0 après l'appel.
    Avec ça, le compilateur effiche <<Trop de paramètres originaux>>

  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
    Pourquoi pas directement un LoadfromFile ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TSIGNATAIRE.BitBtn1Click(Sender: TObject);
    begin
    FDTable1.Edit;
    TBlobField(FDTable1.FieldByName('IMAGE')).LoadFromFile('D:\SIGN.BMP');
    FDTable1.Post;
    end;
    non testé car bientôt en rendez-vous
    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 confirmé Avatar de blonde
    Femme Profil pro
    Développeur Delphi
    Inscrit en
    Septembre 2003
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Septembre 2003
    Messages : 278
    Points : 477
    Points
    477
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Pourquoi pas directement un LoadfromFile ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TSIGNATAIRE.BitBtn1Click(Sender: TObject);
    begin
    FDTable1.Edit;
    TBlobField(FDTable1.FieldByName('IMAGE')).LoadFromFile('D:\SIGN.BMP');
    FDTable1.Post;
    end;
    non testé car bientôt en rendez-vous
    Mais oui, tu as raison. Hi hi, je n'avais même pas lu le début du code

  7. #7
    Membre à l'essai
    Profil pro
    developpeur
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Bénin

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Pourquoi pas directement un LoadfromFile ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TSIGNATAIRE.BitBtn1Click(Sender: TObject);
    begin
    FDTable1.Edit;
    TBlobField(FDTable1.FieldByName('IMAGE')).LoadFromFile('D:\SIGN.BMP');
    FDTable1.Post;
    end;
    non testé car bientôt en rendez-vous
    Y a plus d'erreur, ça marche bien

  8. #8
    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
    Donc, il s'agit d'un problème de définition de champ (ce code fonctionne parfaitement avec Firebird et SQLite)
    comme il s'agit de PostGreSQL et Firedac il faut aller en chercher les spécificités et vérifier les paramètres de connexion
    https://docwiki.embarcadero.com/RADS...eSQL_(FireDAC)
    Regardez en particulier les options ExtendedMetatadata, OidAsBlob et unKnownFormat du FDConnection, testez en définissant les champs pour vérifier que le champ image est considéré comme un ftBlob
    car ce qui ne semble pas être apprécié dans l'instyrcution est le transtypage TBlobField( )
    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

  9. #9
    Membre à l'essai
    Profil pro
    developpeur
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Bénin

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Donc, il s'agit d'un problème de définition de champ (ce code fonctionne parfaitement avec Firebird et SQLite)
    comme il s'agit de PostGreSQL et Firedac il faut aller en chercher les spécificités et vérifier les paramètres de connexion
    https://docwiki.embarcadero.com/RADS...eSQL_(FireDAC)
    Regardez en particulier les options ExtendedMetatadata, OidAsBlob et unKnownFormat du FDConnection, testez en définissant les champs pour vérifier que le champ image est considéré comme un ftBlob
    car ce qui ne semble pas être apprécié dans l'instyrcution est le transtypage TBlobField( )
    Tout marche bien Merci à tous

  10. #10
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Moi ce qui me chagrine le plus, c'est cette ligne : CONSTRAINT "UTILISATEUR_pkey" PRIMARY KEY ("MOTPASS").

    Un mot de passe ne doit JAMAIS constituer la clé primaire d'un utilisateur.
    Ne serait-ce parce qu'un mot de passe ne permet pas de distinguer de manière unique un utilisateur (puisque par définition, il peut changer).
    Ajoute à cela le fait que ça interdit que deux utilisateurs possèdent le même mot de passe.

  11. #11
    Membre à l'essai
    Profil pro
    developpeur
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Bénin

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par popo Voir le message
    Moi ce qui me chagrine le plus, c'est cette ligne : CONSTRAINT "UTILISATEUR_pkey" PRIMARY KEY ("MOTPASS").

    Un mot de passe ne doit JAMAIS constituer la clé primaire d'un utilisateur.
    Ne serait-ce parce qu'un mot de passe ne permet pas de distinguer de manière unique un utilisateur (puisque par définition, il peut changer).
    Ajoute à cela le fait que ça interdit que deux utilisateurs possèdent le même mot de passe.
    Bonjour Mr popo!
    Suis vraiment d'accord avec vous, votre logique, elle est parfaite selon les règles des méthodes d'analyse! Merci à vous.

  12. #12
    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,

    c'est très bien d'indiquer que c'est résolu et de souligner que la structure pouvait être mal ficelée, mais après vos modifications de post on n'est plus sur de la solution.
    Je présume qu'il s'agissait bien d'un problème lié au FDConnection indiqué post #8 et que l'erreur était donc liée aux options citées.
    Il eut donc été mieux de le post qui a mis sur la voie de la correction et nous indiquer quelles étaient les erreurs trouvées qui, une fois corrigées, ont résolu le problème afin que d'autres puissent s'y référer.

    De plus, je changerai le titre, pour passer de "TMemoryStream en Delphi 10.3.3" à "PostGresSQL, mettre à jour un Blob image" parce que le TMemoryStream était complètement inutile
    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

  13. #13
    Membre à l'essai
    Profil pro
    developpeur
    Inscrit en
    Mars 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Bénin

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Mars 2010
    Messages : 25
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    c'est très bien d'indiquer que c'est résolu et de souligner que la structure pouvait être mal ficelée, mais après vos modifications de post on n'est plus sur de la solution.
    Je présume qu'il s'agissait bien d'un problème lié au FDConnection indiqué post #8 et que l'erreur était donc liée aux options citées.
    Il eut donc été mieux de le post qui a mis sur la voie de la correction et nous indiquer quelles étaient les erreurs trouvées qui, une fois corrigées, ont résolu le problème afin que d'autres puissent s'y référer.

    De plus, je changerai le titre, pour passer de "TMemoryStream en Delphi 10.3.3" à "PostGresSQL, mettre à jour un Blob image" parce que le TMemoryStream était complètement inutile
    En fait l'erreur de trouvait au niveau de l'instruction d'ouverture de ladite table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FDTable1.Open("UTILISATEURD")
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FDTable1.Open('utilisateur."UTILISATEURD"')
    , nom table précédé du nom du schéma, voilà ce que j'ai corrigé en me basant sur vos recommandations.

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

Discussions similaires

  1. Différences entre Delphi et Visual Basic ?
    Par Anonymous dans le forum Débats sur le développement - Le Best Of
    Réponses: 75
    Dernier message: 30/03/2009, 20h09
  2. Réponses: 1
    Dernier message: 13/05/2002, 09h19
  3. [Kylix] Migration delphi -> kylix
    Par Christian dans le forum EDI
    Réponses: 1
    Dernier message: 03/04/2002, 22h50
  4. Réponses: 4
    Dernier message: 27/03/2002, 11h03
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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