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 :

Cachedupdate (à true ou à false) d'un IBQuery liés à un IBUpdateSQL


Sujet :

Bases de données Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 12
    Points : 13
    Points
    13
    Par défaut Cachedupdate (à true ou à false) d'un IBQuery liés à un IBUpdateSQL
    Bonjour,
    j'ai lu dans un forum qu'il faut mettre cachedupdate d'un IBQuery à true.

    Cependant dans mon application (avec Interbase et en Local) lorsque je met cachedupdate à false et je valide mes mises à jour sans problème
    par mon IBQuery seulement en appelant Insert, Delete ... sans le UpplyUpdades.évidement la Itransaction et la connexion sont active et
    les propriétés du compo TUpdateSQL (ModifySQL, UpdateSQL...) sont remplies.

    et si je met cachedupdate à true, je doit valiser mes mise à jour en appelant UpplyUpdades.

    donc ou est la diiffernece entre false te true de cachedupdate de mon IBQuery.
    est il Uniquement indispensable de mettre à true cachedupdate lorsq'il s'agit d'une application C/S.

    Merci d'avance,

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par delrama Voir le message
    j'ai lu dans un forum qu'il faut mettre cachedupdate d'un IBQuery à true.
    Ce n'est pas une règle systématique : tout dépend de ce que vous voulez faire des données de votre application cliente vis à vis de la base de données et par conséquence des autres applications clientes : transmettre et valider immédiatement un par un vos traitements (ajouts, modifications ou suppressions), ou les transmettre ultérieurement et les valider en une seule opération...

    Citation Envoyé par delrama Voir le message
    Cependant dans mon application (avec Interbase et en Local) lorsque je met cachedupdate à false et je valide mes mises à jour sans problème
    par mon IBQuery seulement en appelant Insert, Delete ... sans le UpplyUpdades.évidement la Itransaction et la connexion sont active et
    les propriétés du compo TUpdateSQL (ModifySQL, UpdateSQL...) sont remplies.
    Dans ce cas et à moins que vous n'ayez débuté implicitement une transaction, toutes vos opérations seront validées une par une dès leur achèvement (~auto commit).

    Citation Envoyé par delrama Voir le message
    et si je met cachedupdate à true, je doit valiser mes mise à jour en appelant UpplyUpdades.
    Dans ce cas, vos opérations sont stockées dans la mémoire de l'application cliente et ne seront retransmises à la base de données que lors de l'appel de ApplyUpdates, et ce en une seule transaction.

    Citation Envoyé par delrama Voir le message
    donc ou est la diiffernece entre false te true de cachedupdate de mon IBQuery.
    est il Uniquement indispensable de mettre à true cachedupdate lorsq'il s'agit d'une application C/S.
    Cf. ma remarque initiale. Pour choisir une option plutôt que l'autre, il faut garder à l'esprit que vos traitements ne doivent pas affecter la cohérence de votre base de données...

    Exemple : Si vous augmentez vos tarifs unitaires de 10%, vous devez réaliser l'opération en une seule fois (soit avec une transaction implicite démarrée avant le début du traitement et validée une fois terminée, soit avec une mise à jour en mémoire cache et un appel à ApplyUpdates).
    Dans le cas contraire (validation à chaque mise à jour d'un tarif) et un incident (coupure réseau, panne électrique, arrêt brutal de l'application, etc), vous pourriez vous retrouvez avec une base partiellement à jour. Une opération de facturation ultérieure serait en partie erronée : une belle pagaille en perspective...

    Cela dit, avec Delphi, ne pas oublier , vous auriez entre autres obtenu :
    Lorsque les mises à jour en mémoire cache sont activées, les mises à jour d'un ensemble de données (comme la transmission de modifications, l'insertion de nouveaux enregistrements ou la suppression d'enregistrements) sont stockées dans une mémoire cache interne sur la machine client au lieu d'être directement écrites dans les tables de base de données sous-jacentes de l'ensemble de données. Quand les modifications sont terminées, une application écrit dans la base de données toutes les modifications présentes en mémoire cache, dans une transaction unique.

    Remarque*: Au lieu d'utiliser les mises à jour en mémoire cache, les applications peuvent obtenir les mêmes avantages avec un niveau de contrôle plus important en utilisant un ensemble de données client.
    Philippe.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    Bonjour, merci pour ton aide

    mais comment fait il que les Mises à jours sont validées en appelant ApplyUpdates sans le valider avec le commit
    de la transaction.
    dans l'aide delphi:
    (Appelez ApplyUpdates pour écrire dans une base de données les mises à jour en mémoire cache en attente.
    Cette méthode transmet les données en mémoire cache à la base de données pour qu'elles soient stockées,
    mais les modifications ne sont pas validées dans la base de données.
    Une application doit (explicitement) appeler la méthode Commit d'un composant TIBTransaction pour valider
    les modifications dans la base de données si l'écriture réussit,

    ou appeler la méthode Rollback du composant TIBTransaction pour les annuler en cas d'erreur

    à +

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    Le fait d'utiliser ApplyUpdate ne dispense pas de faire un Commit ou un Rollaback.

    L'applyUpdate va transférer les données de la mémoire de l'ordinateur vers la base de données. Par contre la validation et la disponibilité pour les autres utilisateurs ne sera faite qu'au moment du commit ou tout simplement complètement annulé si un rollback. Pour être simple, applyupdate copie les données dans une zone tampon de la base données pour que le retour arrière soit possible.

    Le code peut être présenté ainsi :
    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
    if laBase.inTransaction then
      laBase.StartTransaction;
      try
        {tenter d'écrire les mises à jours dans la base de donnés};
        with Query do
        begin
          if (State <> dsInactive) and UpdatesPending then 
            ApplyUpdates;
        end;
        laBase.Commit;     {en cas de succès, valider les modifications};
      except
        begin
          laBase.Rollback;             {en cas d'échec, annuler les modifications};
          raise;                           {déclencher l'exception pour empêcher l'appel de CommitUpdates!}
        end;
    end;
    A parfaire suivant la base de données utilisée

    Bon courage

  5. #5
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par delrama Voir le message
    mais comment fait il que les Mises à jours sont validées en appelant ApplyUpdates sans le valider avec le commit
    de la transaction.
    Tout simplement parce que ces mises à jour sont transmises au serveur sous la forme d'une ou plusieurs requêtes SQL et que ces requêtes doivent être implicitement auto-validées (paramétrage auto-commit au niveau de la base de données ou du composant qui gère la (les) connexion(s))...
    Philippe.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    Bonjour,
    merci pour vos explications
    mais une portion de code posté par Seabs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if laBase.inTransaction then
      laBase.StartTransactio;
        //suite
    mais comment démarrer une transaction alors qu’une transaction est en cours

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if not laBase.inTransaction
    peut être un oubli ou c moi qui se trompe.

    salut à +

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    Effectivement, j'ai commis une erreur dans mon code, j'ai oublié not.

    Il faut effectivement faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if not laBase.inTransaction then
       laBase.StartTransaction;
    Avec mes excuses pour le contretemps.

    Bon courage

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

Discussions similaires

  1. requete avec en retour true ou false
    Par zarzar4 dans le forum Développement
    Réponses: 6
    Dernier message: 19/11/2008, 17h16
  2. Débutant .. Champ True à rendre False
    Par trinity4you dans le forum Access
    Réponses: 17
    Dernier message: 27/10/2006, 18h03
  3. Réponses: 1
    Dernier message: 03/03/2006, 13h07
  4. probleme affichage visible = true ou false
    Par Hitmaaan dans le forum Access
    Réponses: 4
    Dernier message: 29/09/2005, 14h17

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