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 :

TClientDataSet LoadFromStream TMemoryStream


Sujet :

Bases de données Delphi

  1. #1
    Membre habitué Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 263
    Points : 172
    Points
    172
    Par défaut TClientDataSet LoadFromStream TMemoryStream
    Bonjour a tous et a toute, meilleurs voeux 2024

    Je chercher à ouvrir un TClientDataSet avec un TMemoryStream.
    Impossible de chargé le ClientDataSet avec le Stream, les données sont bien dans le TMemoryStream.

    Coté ClientDataset aucune erreur lors du chargement LoadFromStream.

    Exemple :

    DataSet : TClientDataSet
    FileStream : TECLFileStream // Easy Compression Library
    MemoryStream : TMemoryStream

    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
     with scOpenDialog do
        begin
          Title := 'Restaurer une sauvegarde';
          DefaultExt := '.wbak';
          Filter := 'WinDoc.Backup|*.wbak';
          InitialDir := TPath.GetDocumentsPath;
          FileName := EmptyStr;
          MultiSelection := False;
     
          if Execute then
          begin
            MemoryStream := TMemoryStream.Create;
            FileStream := TECLFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
            FileStream.SaveToStream(MemoryStream);
            MemoryStream.Position := 0;
     
            DataSet.EmptyDataSet;        
            DataSet.LoadFromStream(MemoryStream);
     
            FreeAndNil(FileStream);
            FreeAndNil(MemoryStream);
          end;
        end;
    Avez vous déjà eu ce problème ?

    Merci pour vos retours
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.

  2. #2
    Membre habitué Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 263
    Points : 172
    Points
    172
    Par défaut
    Citation Envoyé par XeGregory Voir le message

    Exemple :

    DataSet : TClientDataSet
    FileStream : TECLFileStream // Easy Compression Library
    MemoryStream : TMemoryStream

    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
     with scOpenDialog do
        begin
          Title := 'Restaurer une sauvegarde';
          DefaultExt := '.wbak';
          Filter := 'WinDoc.Backup|*.wbak';
          InitialDir := TPath.GetDocumentsPath;
          FileName := EmptyStr;
          MultiSelection := False;
     
          if Execute then
          begin
            MemoryStream := TMemoryStream.Create;
            FileStream := TECLFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
            FileStream.SaveToStream(MemoryStream);
            MemoryStream.Position := 0;
     
            DataSet.EmptyDataSet;        
            DataSet.LoadFromStream(MemoryStream);
     
            FreeAndNil(FileStream);
            FreeAndNil(MemoryStream);
          end;
        end;

    J'ai sauvegardé le TMemoryStream pour voir si le fichier xml été bien constitué.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MemoryStream.SaveToFile('DataSet.xml);
    Aucun problème, je peut chargé ce fichier dans le ClientDataSet sans problème.
    Donc le problème ne vient pas de la décompression du fichier (???.wbak).
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.

  3. #3
    Membre habitué Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 263
    Points : 172
    Points
    172
    Par défaut
    Je suis tombé sur ce sujet sur le Forums https://www.developpez.net/forums/d2...-memorystream/

    Effectivement créer un fichier temporaire puis chargé le fichier dans un ClientDataSet puis cloné les ClientDataSet cela résout le problème.
    Mes bon cela explique pas pourquoi le ClientDataSet ne veut pas prendre en charge les données des Stream. TStream, TMemoryStream.

    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
    Var 
    ClientDataSet: TClientDataSet; 
     
    begin 
    ClientDataSet := TClientDataSet.Create(Nil); 
     
    try 
      ClientDataSet.LoadFromFile('DataSet.xml');
      ClientDataSet.open;
      DataSet.EmptyDataSet
      DataSet.CloneCursor(ClientDataSet, False, False);
    finally 
     
      ClientDataSet.Free; 
    end;
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.

  4. #4
    Membre habitué Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 263
    Points : 172
    Points
    172
    Par défaut
    C'est marrent parce que le procédure "ClientDataSet.LoadFromFile" passe bien par un TStream puis appel la procédure "LoadFromStream" cela ne posse pas de problème.

    La seule différence en LoadFromFile & LoadFromStream :

    LoadFromFile : Le TCustomClientDataSet Crée le TStream.
    LoadFromStream : Nous créons le TStream.

    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
    procedure TCustomClientDataSet.LoadFromFile(const FileName: string = '');
    var
      Stream: TStream;
    begin
      Close;
      if FileName = '' then
        Stream := TFileStream.Create(Self.FileName, fmOpenRead or fmShareDenyWrite)
      else
    {$IFDEF MSWINDOWS}
        Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
    {$ENDIF}
    {$IFDEF POSIX}
        Stream := TFileStream.Create(ExpandFileName(FileName), fmOpenRead or fmShareDenyWrite);
    {$ENDIF}
      try
        FOpeningFile := True;
        try
          LoadFromStream(Stream);
        finally
          FOpeningFile := False;
        end;
      finally
        Stream.Free;
      end;
    end;
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.

  5. #5
    Membre habitué Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 263
    Points : 172
    Points
    172
    Par défaut
    Je pence avoir résolut le problème en passent par un autre TClientDataSet (TMPDataSet).

    Exemple :

    DataSet : TClientDataSet
    TMPDataSet : TClientDataSet
    FileStream : TECLFileStream // Easy Compression Library
    MemoryStream : TMemoryStream

    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
    with scOpenDialog do
        begin
          Title := 'Restaurer une sauvegarde';
          DefaultExt := '.wbak';
          Filter := 'Backup|*.wbak';
          InitialDir := TPath.GetDocumentsPath;
          FileName := EmptyStr;
          MultiSelection := False;
     
          if Execute then
          begin
            MemoryStream := TMemoryStream.Create;
            FileStream := TECLFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
            FileStream.SaveToStream(MemoryStream);
     
            MemoryStream.Position := 0;
            TMPDataSet := TClientDataSet.Create(Nil);
            TMPDataSet.LoadFromStream(MemoryStream);
     
            DataSet.EmptyDataSet;
            DataSet.CloneCursor(TMPDataSet, False, False); // Clone
     
            FreeAndNil(TMPDataSet);
            FreeAndNil(FileStream);
            FreeAndNil(MemoryStream);
          end;
        end;
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.

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

Discussions similaires

  1. [TClientDataSet] Erreur de chargement du fichier MIDAS.DLL
    Par Manopower dans le forum Bases de données
    Réponses: 10
    Dernier message: 31/08/2016, 14h08
  2. tclientdataset et champs calculés
    Par frantzgac dans le forum Bases de données
    Réponses: 1
    Dernier message: 06/10/2004, 22h38
  3. Synchronisation de deux TClientDataSet
    Par stephane_lec dans le forum Bases de données
    Réponses: 9
    Dernier message: 03/03/2004, 16h42
  4. Problème avec TMemoryStream + jpeg
    Par zymoplex dans le forum Langage
    Réponses: 2
    Dernier message: 01/02/2004, 19h46
  5. [Kylix] MyBase et TClientDataSet
    Par lancelot69 dans le forum EDI
    Réponses: 1
    Dernier message: 09/09/2003, 21h47

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