ayadi001
Messages postés42Date d'inscriptiondimanche 12 juin 2011StatutMembreDernière intervention19 octobre 2011
-
13 sept. 2011 à 16:25
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 2014
-
3 oct. 2011 à 17:47
Bonjour,
j'ai une application de base de donnée sous Delphi, paradox, lorsque j’insère des nouvelles données, je les trouves pas jusqu’à la fermeture de l'application et l’exécution a nouveau .
comment résoudre ce probleme, afin lorsque au moment d'insertion je le trouve dans la consultation .
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 13 sept. 2011 à 18:25
Bonjour,
Les données sont mises en mémoire tampon jusqu'à une action délibérée d'écriture du tampons sur disque ou la fermeture de la table.
Si tu veux forcer l'écriture sur le support physique, appelles la méthode Flush du composant TTable.
Je voudrais aussi te signaler un point méconnu : les conséquences de l'utilisation de l'appel à Application.Terminate. Pour en avoir fait l'expérience, l'application est détruite sans passer par un appel aux méthodes Close des composants TTable et donc...pas de vidage des buffers et...pas d'écriture sur disque. J'ai déjà eu l'occasion de mentionner ce détail sur ce forum plusieurs fois mais ce sont des choses que l'on oublie facilement.
May Delphi be with you
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 20 sept. 2011 à 15:24
Salut DelphiProg,
j' ai testé ta méthode TTable.FlushBuffers qui semble avoir corrigé un problème qui perdure depuis un moment uniquement sous Windows Server 2008:
J' ai une appli "serveur mail" (Appli Delphi 2009 + tables DBase qui importe les mails de plusieurs comptes) qui tourne donc sous Windows Server 2008.
Le problème que j' avais est que lorsque l' appli met à jour ou je crée des enregistrements, ceux-ci n' étaient pas tous le temps visibles immédiatement par les postes de travail malgrè l' utilisation de DbiSaveChanges() et malgrè la fermeture de la table (TTable.Active := false).
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 21 sept. 2011 à 11:10
Salut DelphiProg,
sisi, mon problème est spécifique à Windows Server2008 car la même appli tournant sur une marchine avec XP, Vista ou Win7 ne pose pas de problème.
Je suis sur le mode d' isolation par défaut (Read commited).
Je pense que cela vient du Borland Database Engine qui n' est pas fait pour tourner sur Windows Server mais curieusement, je n' ai pas ce problème sous Vista ou Windows 7.
Pour reproduire le problème, c' est très simple: je fais un programme qui me visualise une table sur réseau via un TDBGrid + TTable + TDatasource.
Je rajoute un bouton qui fait un Refresh sur la table.
Test1: J' ouvre l' appli sur 2 machines qui ne sont pas équipées de Windows Server 2008.
-------------------------------------------------------------------------------------------------------------------
Lorsque je modifie un enregistrement sur la machine "A" et que je sauvegarde, si je clique sur "Refresh" sur la machine "B", je vois les modifications.
Test2: J' ouvre l' appli sur 2 machines : machine "A" équipées de Windows Server 2008 et "B" équipée de Windows XP.
-------------------------------------------------------------------------------------------------------------------
Lorsque je modifie un enregistrement sur la machine A et que je sauvegarde, si je clique sur "Refresh" sur la machine B, je ne vois PAS les modifications.
Maintenant si j' exécute "FlushBuffers" dans le AfterPost de la table, je vois les modifications!
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 3 oct. 2011 à 17:47
Resalut,
aprés avoir testé .FlushBuffers pendant plusieurs jours sur mon appli tournant sous Windows Server 2008, je me suis rendu compte que le problème que j' ai n' est pas totalement résolu:
bien que la table soit bien mise à jour, les indexes crées (en ajoutant des enregistrements) ne sont pas mis à jour physiquement dans le fichier *.mdx) par la commande alors qu' elle fonctionne parfaitement pour les données (fichier *.dbf).
Et comme mon appli fait un SetRange() sur un indexe pour récupérer les nouveaux mails d' un compte, il arrive que certains mails marqués comme "nouveaux" n' apparaissent qu' après un certains temps ou lorsque l' appli vient rajouter de nouveaux enregistrements" ...
Il me faudrait un FlushBuffers pour le fichiers *.mdx !