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 :

FIREDAC - EmptyDataSet;


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 41
    Points : 45
    Points
    45
    Par défaut FIREDAC - EmptyDataSet;
    Bonjour,
    sur un petit programme de test, j'essaye d'effacer tout les enregistrements d'une table avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FDTable1.EmptyDataSet;
    je n'obtient aucune reaction du programme, ni aucun message
    je ne comprend pas pourquoi !
    un peu d'aide serait la bienvenue

    Merci.

  2. #2
    Rédacteur/Modérateur

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

    Cela manque un peu d'informations. Cette table est une table d'une base de données (laquelle) ?
    Dans quel contexte (mémoire cache ou pas) ?
    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
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par voxben Voir le message
    Bonjour,
    sur un petit programme de test, j'essaye d'effacer tout les enregistrements d'une table avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FDTable1.EmptyDataSet;
    je n'obtient aucune reaction du programme, ni aucun message
    je ne comprend pas pourquoi !
    un peu d'aide serait la bienvenue
    Merci.
    Par requête SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FDTable1.ExecSQL('DELETE FROM matable');

  4. #4
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 41
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    Cela manque un peu d'informations. Cette table est une table d'une base de données (laquelle) ?
    Dans quel contexte (mémoire cache ou pas) ?
    Base de données sqlite.
    Cache table sur false.

  5. #5
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 41
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par ALWEBER Voir le message
    Par requête SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FDTable1.ExecSQL('DELETE FROM matable');
    Avec SQL sur un query ou directement sur la connexion ça marche tres bien.
    C l'usage du emptydataset que je ne comprends pas

  6. #6
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par voxben Voir le message
    Avec SQL sur un query ou directement sur la connexion ça marche tres bien.
    C l'usage du emptydataset que je ne comprends pas
    Le dataSet est alimenté par la requête. Donc c'est la source qu'il faut vider. Le "Empty" est plutôt destiné aux Tables Mémoires en vidant le contenu de la propriété 'Content'
    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
     
      object Table1: TFDMemTable
        Active = True
        FetchOptions.AssignedValues = [evMode]
        FetchOptions.Mode = fmAll
        ResourceOptions.AssignedValues = [rvPersistent, rvSilentMode]
        ResourceOptions.Persistent = True
        ResourceOptions.SilentMode = True
        UpdateOptions.AssignedValues = [uvCheckRequired, uvAutoCommitUpdates]
        UpdateOptions.CheckRequired = False
        UpdateOptions.AutoCommitUpdates = True
        Left = 48
        Top = 120
        Content = {
          414442530F00000081030000FF00010001FF02FF0304000C0000005400610062
          006C006500310005000C0000005400610062006C006500310006000000000007
          0000080032000000090000FF0AFF0B0400120000006E0075006D0063006C0069
          0065006E007...

  7. #7
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 41
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par ALWEBER Voir le message
    Le dataSet est alimenté par la requête. Donc c'est la source qu'il faut vider. Le "Empty" est plutôt destiné aux Tables Mémoires en vidant le contenu de la propriété 'Content'
    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
     
      object Table1: TFDMemTable
        Active = True
        FetchOptions.AssignedValues = [evMode]
        FetchOptions.Mode = fmAll
        ResourceOptions.AssignedValues = [rvPersistent, rvSilentMode]
        ResourceOptions.Persistent = True
        ResourceOptions.SilentMode = True
        UpdateOptions.AssignedValues = [uvCheckRequired, uvAutoCommitUpdates]
        UpdateOptions.CheckRequired = False
        UpdateOptions.AutoCommitUpdates = True
        Left = 48
        Top = 120
        Content = {
          414442530F00000081030000FF00010001FF02FF0304000C0000005400610062
          006C006500310005000C0000005400610062006C006500310006000000000007
          0000080032000000090000FF0AFF0B0400120000006E0075006D0063006C0069
          0065006E007...
    Dans ce cas, puisque emptydataset n'agit que sur TFDmemTable,
    Pourquoi est elle accessible par TFDTable ?

  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
    Supprime tous les enregistrements du stockage de données interne de l'ensemble de données.

    Appelez EmptyDataSet pour vider l'ensemble de données en supprimant tous les enregistrements du stockage de données interne et du journal des modifications.
    Est-ce que le composant table est bien ouvert avant d'appeler cette fonction ??

  9. #9
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 41
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Est-ce que le composant table est bien ouvert avant d'appeler cette fonction ??
    oui le FDTable est ouvert - si FDTable est fermé une erreur s'affiche

  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
    Sinon ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      TFDTableHelper = class helper for TFDTable
        procedure EmptyDataset;
      end;
     
    ...
     
    { TFDTableHelper }
     
    procedure TFDTableHelper.EmptyDataset;
    begin
      ExecSQL(Format('DELETE FROM %s', [TableName]));
    end;

  11. #11
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 41
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Sinon ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      TFDTableHelper = class helper for TFDTable
        procedure EmptyDataset;
      end;
     
    ...
     
    { TFDTableHelper }
     
    procedure TFDTableHelper.EmptyDataset;
    begin
      ExecSQL(Format('DELETE FROM %s', [TableName]));
    end;
    Avec SQL sur un query ou directement sur la connexion ça marche tres bien.
    C l'usage du emptydataset que je ne comprends pas

  12. #12
    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
    J'ai testé emptydataset et je n'e comprends pas non plus. Tout ce que je sais c'est que je suis content d'être tombé sur ce sujet, ça va m'éviter bien des problèmes très prochainement.

  13. #13
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    EmptyDataSet() est pourtant parfaitement décrit dans la documentation

    Supprime tous les enregistrements du stockage de données interne de l'ensemble de données.
    Appelez EmptyDataSet pour vider l'ensemble de données en supprimant tous les enregistrements du stockage de données interne et du journal des modifications.
    Cela vide uniquement ce qu'il y a en mémoire et c'est tout simplement pour reproduire le TClientDataSet qui fournit aussi une méthode EmptyDataSet souvent utilisé dans un contexte de cache avec commit via le journal, une fois les données poussées, elles n'ont plus raison d'exister, le tampon est appliqué (propriété Delta)

    Donc c'est une méthode à utiliser uniquement si l'on utilise le TFDDataSet comme un TClientDataSet (FieldDefs.Ad, CreateDataSet ...)
    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

  14. #14
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 41
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    EmptyDataSet() est pourtant parfaitement décrit dans la documentation



    Cela vide uniquement ce qu'il y a en mémoire et c'est tout simplement pour reproduire le TClientDataSet qui fournit aussi une méthode EmptyDataSet souvent utilisé dans un contexte de cache avec commit via le journal, une fois les données poussées, elles n'ont plus raison d'exister, le tampon est appliqué (propriété Delta)

    Donc c'est une méthode à utiliser uniquement si l'on utilise le TFDDataSet comme un TClientDataSet (FieldDefs.Ad, CreateDataSet ...)
    Merci,
    j'ai bien saisie le truc en jouant sur le CachedUpdates le fonctionnement devient "visible".
    comme une method EmptyTable existe pour TTable, je me suis borné a chercher un equivalent pour TDFTable, qui apriori n'existe pas.
    la seule solution efficace pour vider un TFDTable est donc de passer par le SQL.

  15. #15
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    C'est le problème de l'existance du TFDTable, à quoi peut bien servir ce composant, tout peut être fait avec un TFDQuery, c'est même plus "prudent" pour maitriser ce qui est chargé et ce qui est écrit en base.

    le TTable c'était idéal pour Paradox et DBase, voire Access, le driver était adapté pour la lecture de ce genre de base de données qui n'était que de simple fichier séquentiel indexé.

    Avec une base de donnée distante, il faut repenser la lecture, éviter au maximum un SELECT * FROM ... sans WHERE, c'est contre-performant.
    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

  16. #16
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 41
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    C'est le problème de l'existance du TFDTable, à quoi peut bien servir ce composant, tout peut être fait avec un TFDQuery, c'est même plus "prudent" pour maitriser ce qui est chargé et ce qui est écrit en base.

    le TTable c'était idéal pour Paradox et DBase, voire Access, le driver était adapté pour la lecture de ce genre de base de données qui n'était que de simple fichier séquentiel indexé.

    Avec une base de donnée distante, il faut repenser la lecture, éviter au maximum un SELECT * FROM ... sans WHERE, c'est contre-performant.
    plus j'avance dans l'etude des bases de données avec delphi plus je me rend compte que ce qui peut etre ecrit directement en SQL doit etre fait en SQL.

  17. #17
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 044
    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 044
    Points : 40 962
    Points
    40 962
    Billets dans le blog
    62
    Par défaut
    Voilà un très bon adage. Donc exit FDTable bonjour FDQuery et FDUpdateSQL ?
    Bon enfin ce n'est pas toujours vrai, les FDmemtable, la possibilité de cachedata , les possibilités d'injection dans le SQL sont des paramètres (et j'en oublie) à prendre en compte
    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

  18. #18
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 41
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Voilà un très bon adage. Donc exit FDTable bonjour FDQuery et FDUpdateSQL ?
    Bon enfin ce n'est pas toujours vrai, les FDmemtable, la possibilité de cachedata , les possibilités d'injection dans le SQL sont des paramètres (et j'en oublie) à prendre en compte
    FDMemTable et cachedata, je vois à peut pres leurs utilités par contre je ne vois pas comment FDTable pourrait protégé contre l'injection SQL.

  19. #19
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 044
    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 044
    Points : 40 962
    Points
    40 962
    Billets dans le blog
    62
    Par défaut
    Je parlais des FDQuery si l'on applique l'adage "ce qui peut être écrit directement en SQL doit être fait en SQL."
    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

Discussions similaires

  1. Mise à jour de Firedac (Update 2)
    Par SergioMaster dans le forum Delphi
    Réponses: 11
    Dernier message: 02/05/2014, 21h37
  2. XE2 FireDac ODBC : message d'erreur
    Par artmicro dans le forum Bases de données
    Réponses: 1
    Dernier message: 23/08/2013, 09h05
  3. XE4 , Firedac et datasnap
    Par SergioMaster dans le forum Bases de données
    Réponses: 8
    Dernier message: 01/06/2013, 09h40
  4. Embarcadero propose FireDAC pour l'accès aux Bdd
    Par John Colibri dans le forum Delphi
    Réponses: 0
    Dernier message: 01/03/2013, 06h56

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