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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    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
    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
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 101
    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 confirmé

    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
    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 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    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 236
    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
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 101
    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 confirmé

    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
    Par défaut
    Merci Rayek,

    Effectivement ce point est réglé.

  7. #7
    Membre Expert 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
    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

+ 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