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

Bases de données Delphi Discussion :

DataSet : Affecter les données d'un pointeur


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Août 2003
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Points : 91
    Points
    91
    Par défaut DataSet : Affecter les données d'un pointeur
    Bonjour à tous,

    J'utilise un TClientDataSet et un TDataSetProvider pour créer une table dans un fichier XML.

    La table comporte 2 champs :

    XMLogID: TStringField;

    XMLData: TWideMemoField // Ce champ peut contenir plusieurs milliers de carctères en UTF8


    Dans le code ci-dessous, comment je fais pour assigner la valeur de XMLData qui est un pointeur au TWideMemoField XMLogXMLData: ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Procedure TDatabase.XMLog( LogID: String; XMLData: PByte; XMLCount: Integer);
    begin
     
    if (Database.XMLog.State <> dsInactive)
    then begin
         Database.XMLog.Append;
         Database.XMLogID.Value := LogID;
     
         Database.XMLogXMLData ??????? // comment lui passer le contenu de XMLData^
     
         end;
    end;

    Merci d'avance
    Wilco

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    LoadFromStream du TBlobField si c'est un binaire pure, un TMemoryStream pour mapper ton pointeur
    Sinon un TVarBytesField et SetData mais c'est un peu brut, je l'ai fait en Sybase, j'ai du gérer deux octets supplémentaires pour indiquer la taille réelle du blob aussi bien à la lecture qu'à l'écriture


    TWideMemoField je ne connais pas, mais si c'est une chaine, utilise AsString ou AsWideString cela convertira selon ta version de delphi de Ansi à UTF8 ou Unicode à UTF8
    Si cela ne le fait pas automatiquement UTF8Encode
    Mais je te déconseille de stocker un binaire en String ou alors encode en Base64 avant

    Normalement, ce n'est pas un encodage du champ mais l'ensemble du fichier XML qui est encodé en UTF8 par SaveToFile
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Août 2003
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Points : 91
    Points
    91
    Par défaut
    Merci Shail,

    J'ai remplacer mon TWideMemoField par un TblobField.
    J'ai déclaré un TMemoryStream et voici le code de la fonction :

    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
     
     
    Procedure TDatabase.XMLog( LogID: String; XMLData: PByte; XMLCount: 
    Integer);
    var
       LogData: TMemoryStream;
     
    begin
    //GetMem(LogData, XMLCount);
    //LogData.SetSize(XMLCount);
     
    LogData.Write(XMLData, XMLCount);
     
    if (Database.XMLog.State <> dsInactive)
    then begin
         Database.XMLog.Append;
         Database.XMLogID.Value := LogID;
     
         Database.XMLogXMLData.LoadFromStream(LogData);  //<- ça plante ici
     
         end;
    end;


    ça plante quand il veut faire le LoadFromStream. J'ai essayé en attribuant la mémoire du TMemoryStream mais ça plante toujours.

    Merci d'avance,
    Wilco

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Tu n'instancies pas LogData c'est normal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    LogData := TMemoryStream.Create;
    Try
     // ton code
    finally
      LogData.Free;
    End;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    J'espère qu'il y avait l'instanciation, sinon le Write aura planter avant !
    Pense à "rembobiner" le stream

    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
    Procedure TDatabase.XMLog( LogID: String; XMLData: PByte; XMLCount: 
    Integer);
    var
       LogData: TMemoryStream;
    begin
      if (Database.XMLog.State <> dsInactive) then
      begin
         Database.XMLog.Append;
         Database.XMLogID.Value := LogID;
     
         LogData := TMemoryStream.Create;
         try
           LogData.Write(XMLData, XMLCount); // déplace la position, imagine le stream comme une bande 
           LogData.Position := 0;
           Database.XMLogXMLData.LoadFromStream(LogData);  //<- ça plante ici
     
         finally
           LogData.Free;
         end;
     
         Database.XMLog.Post; // faudra y penser aussi !
     
       end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par Wilco Voir le message
    Bonjour à tous,

    J'utilise un TClientDataSet et un TDataSetProvider pour créer une table dans un fichier XML.
    si pour crée un fichier xml, t'as pas besoin de TDataSetProvider
    si tu as besoin d'une base mieux voir autre chose: fb, sqllite,...
    autre chose, la taille max d'un champs dans clientdataset ne dépasse pas 56700 je crois, à voir
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  7. #7
    Membre régulier

    Profil pro
    Inscrit en
    Août 2003
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Points : 91
    Points
    91
    Par défaut
    Merci Rayek,

    Effectivement ce point est réglé.

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

Discussions similaires

  1. Affecter les données d'une table à une autre table
    Par babacan dans le forum Développement
    Réponses: 5
    Dernier message: 13/03/2009, 15h08
  2. affecter les donnes d'un fichier vers ListBox
    Par touf213 dans le forum C++Builder
    Réponses: 1
    Dernier message: 04/07/2007, 00h18
  3. [C# 2005]recuperer les données d'un dataset
    Par skud dans le forum Windows Forms
    Réponses: 2
    Dernier message: 18/09/2006, 17h55
  4. [VB.NET] Transférer les données d'un dataset vers excel ??
    Par beegees dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/06/2006, 18h59
  5. Réponses: 3
    Dernier message: 08/12/2005, 10h38

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