OVH Cloud OVH Cloud

dbOpenTable : desactiver les Transactions ?

2 réponses
Avatar
Patrice Dargenton
Bonjour,
est-il possible de désactiver les transactions d'un RecordSet ouvert avec
dbOpenTable afin de faire un grand nombre de mises à jour ? j'ai une base
Access 2000 dont la taille explose systématiquement (lorsque les données
changent effectivement lors de la mise à jour). Pour le moment, je n'ai vu
dans la doc qu'il était seulement possible de désactiver les transactions
pour les requêtes action (UseTransaction à false).
Merci.
-------------------------------------------------------
Patrice Dargenton
patrice.dargenton@free.fr
http://patrice.dargenton.free.fr/index.html
-------------------------------------------------------

2 réponses

Avatar
Benoit Compoint
Bonjour,

A partir de l'appel de la méthode Edit, les nouvelles données destinées à
l'enregistrement courant sont bufferisées.
Il est conseillé de faire appel assez rapidement à la méthode Update afin de
vider le buffer.
En tout cas il faut appeler la méthode Update avant de passer à un autre
enregistrement.

C'est pourquoi je ne comprends pas bien cette question :
Est-ce que "un grand nombre de mises à jour" signifie qu'un grand nombre
d'enregistrements sont modifiés ?

Si un grand nombre de mises à jour doivent être effectuées dans un même
enregistrement qui comporterait un très grand nombre de champs, il est
toujours possible d'appeler plusieurs fois les méthodes Edit et Update afin
de morceler cette mise à jour "volumineuse" en plusieurs "petites" mises à
jour sur un nombre limité de champs.

Benoît Compoint.

"Patrice Dargenton" wrote in message
news:3f97964b$0$229$
Bonjour,
est-il possible de désactiver les transactions d'un RecordSet ouvert avec
dbOpenTable afin de faire un grand nombre de mises à jour ? j'ai une base
Access 2000 dont la taille explose systématiquement (lorsque les données
changent effectivement lors de la mise à jour). Pour le moment, je n'ai vu
dans la doc qu'il était seulement possible de désactiver les transactions
pour les requêtes action (UseTransaction à false).
Merci.
-------------------------------------------------------
Patrice Dargenton

http://patrice.dargenton.free.fr/index.html
-------------------------------------------------------





Avatar
Patrice Dargenton
Bonjour,

"Benoit Compoint" a écrit dans le message de
news:
Bonjour,

A partir de l'appel de la méthode Edit, les nouvelles données destinées à
l'enregistrement courant sont bufferisées.
Il est conseillé de faire appel assez rapidement à la méthode Update afin
de

vider le buffer.
En tout cas il faut appeler la méthode Update avant de passer à un autre
enregistrement.


Ca c'est clair, d'ailleurs je ne savait même pas que l'on pouvait passer à
un autre enregistrement sans faire de mise à jour !!!

C'est pourquoi je ne comprends pas bien cette question :
Est-ce que "un grand nombre de mises à jour" signifie qu'un grand nombre
d'enregistrements sont modifiés ?


Oui, tout à fait.

Si un grand nombre de mises à jour doivent être effectuées dans un même
enregistrement qui comporterait un très grand nombre de champs, il est
toujours possible d'appeler plusieurs fois les méthodes Edit et Update
afin

de morceler cette mise à jour "volumineuse" en plusieurs "petites" mises à
jour sur un nombre limité de champs.


Il y a une dizaine de champs, ce n'est pas très volumineux, par contre il y
a 10 000 enregistrements. Si je pouvais faire une requête action, je
pourrais désactiver les transactions, mais il est très rare de pouvoir faire
une requête éditable lorsqu'il y a un joint un peu complexe. Je pourrais
également ouvrir une requête mise à jour via un QueryDef pour lequel je
désactive les transactions, mais j'ai remarqué que la propriété Transactions
reste à True pour le RecordSet. De plus, dbOpenTable n'est pas possible avec
un QueryDef, or la méthode Seek avec dbOpenTable est 100 fois plus rapide
que la méthode FindFirst. En désespoir de cause, j'avais même commencé à
refaire entièrement mon programme en construisant une collection de classes
VB pour faire une structure de données en RAM !!! (mais c'est compliqué car
il faut ensuite sérialiser la structure "à la main" pour faire la
persistance...)
Je pense que c'est les transactions qui font exploser ma base : je passe de
20 Mo à 500 Mo, puis je redescend à 20 Mo après compactage... mais après 15
minutes de travail, alors que si je pouvait désactiver les transactions, je
pourrais faire le tout en 3 minutes.
Comment savoir quand faire appel à Update pour vider le buffer ? je pourrais
effectivement le faire en 2 ou 3 fois.

Merci, a+,
-------------------------------------------------------
Patrice Dargenton

http://patrice.dargenton.free.fr/index.html
-------------------------------------------------------

Benoît Compoint.

"Patrice Dargenton" wrote in message
news:3f97964b$0$229$
Bonjour,
est-il possible de désactiver les transactions d'un RecordSet ouvert
avec


dbOpenTable afin de faire un grand nombre de mises à jour ? j'ai une
base


Access 2000 dont la taille explose systématiquement (lorsque les données
changent effectivement lors de la mise à jour). Pour le moment, je n'ai
vu


dans la doc qu'il était seulement possible de désactiver les
transactions


pour les requêtes action (UseTransaction à false).
Merci.
-------------------------------------------------------
Patrice Dargenton

http://patrice.dargenton.free.fr/index.html
-------------------------------------------------------