Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1226 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [MFC] ADO est trop lent !

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[MFC] ADO est trop lent !

n°537458
iS@mi
Resistance is futile !
Posté le 12-10-2003 à 09:56:39  profilanswer
 

J'utilise la class CADORecordset qui est très pratique mais qui est très lente lors qu'elle doit effacer d'un coup 5000 records d'une table.
 
L'opération prend 15 secondes via mon programme tandis qu'elle est pratiquement instantanée vie Access et je me demande si c'est normal ou si j'ai fait de mauvais réglages (le tout en compilation relaese avec les optimisations).
 
En générale vous avez ce genre de problème avec vos bases de données, quelle class, système ou protocole utilisez-vous avec vos application ?
 
Merci
 

Code :
  1. if(Table.GetRecordCounts() > 0)
  2. {
  3.    Table.MoveFirst();
  4.    while(!Table.isEof())
  5.    {
  6.       Table.Delete();
  7.       Table.MoveNext();
  8.    }
  9. }


 
Pour les infos sur la class :
http://www.codeproject.com/databas [...] xx431159xx

mood
Publicité
Posté le 12-10-2003 à 09:56:39  profilanswer
 

n°537466
Taz
bisounours-codeur
Posté le 12-10-2003 à 11:24:56  profilanswer
 

bah execute une requete SQL ...

n°537478
drasche
Posté le 12-10-2003 à 12:00:58  profilanswer
 

purée je rêve :/
 
Comme dit Taz, un petit DELETE FROM MATABLE et ton problème sera résolu. D'ailleurs ta comparaison est mauvaise, tu vois bien qu'ici tu effaces tes records un à un alors qu'en Access, tu les effaces en une seule opération (Ctrl-A puis Del) pas vrai?


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°537495
iS@mi
Resistance is futile !
Posté le 12-10-2003 à 12:22:28  profilanswer
 

drasche a écrit :

purée je rêve :/
 
Comme dit Taz, un petit DELETE FROM MATABLE et ton problème sera résolu. D'ailleurs ta comparaison est mauvaise, tu vois bien qu'ici tu effaces tes records un à un alors qu'en Access, tu les effaces en une seule opération (Ctrl-A puis Del) pas vrai?


 
En fait c'est pas si simple.
Je ne dois pas effacer toute une table mais certains records sous certaines conditions (qqs miliers à effacer qd même).

n°537500
drasche
Posté le 12-10-2003 à 12:30:21  profilanswer
 

ben tu reprends le delete avec une clause WHERE [:spamafote]
 
Je serais bien curieux de savoir comment tu fais en Access.


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°537518
Taz
bisounours-codeur
Posté le 12-10-2003 à 12:49:21  profilanswer
 

drasche a écrit :

ben tu reprends le delete avec une clause WHERE [:spamafote]
 
Je serais bien curieux de savoir comment tu fais en Access.

CTRL + clique , Suppr

n°537621
iS@mi
Resistance is futile !
Posté le 12-10-2003 à 15:46:19  profilanswer
 

drasche a écrit :

ben tu reprends le delete avec une clause WHERE [:spamafote]
 
Je serais bien curieux de savoir comment tu fais en Access.


 
Voilà, j'ai utilisé les requetes pour tout effacer d'un coup et plus de problème de vitesse.
 
A force d'utiliser, Add, delete, Add, Delete on en oublie les bonnes mannies  :D

n°537658
red factio​n
Posté le 12-10-2003 à 17:01:19  profilanswer
 

SQl ca pas ete fait pour les chiens  :D

n°539294
blackgodde​ss
vive le troll !
Posté le 14-10-2003 à 15:01:25  profilanswer
 

bin théoriquement le SQL est beaucoup plus rapide de de bricoler sur les objets représentant la base (qui font des requetes SQL en interne)


---------------
-( BlackGoddess )-
n°539300
drasche
Posté le 14-10-2003 à 15:03:52  profilanswer
 

ce n'est pas que théorique, la preuve :D


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
mood
Publicité
Posté le 14-10-2003 à 15:03:52  profilanswer
 

n°539307
MagicBuzz
Posté le 14-10-2003 à 15:11:12  profilanswer
 

En plus, l'avantage d'un DELETE, c'est que si ça échoue, alors aucune ligne ne sera effacée, c'est transactionnel (unitairement).
Ca évite de se retrouver avec une base bancale suite à un problème.

n°539406
iS@mi
Resistance is futile !
Posté le 14-10-2003 à 16:25:24  profilanswer
 

Est-il possible en SQL d'ajouteur selon le nombre que l'on veut un même records en plusieurs examplaires ?
 
Style, ajouter 250x le même records :
 
 "INSERT INTO ma_table 250x (nom,message,date) VALUES ('Ingride','Message 4','lundi')";
 
Ca serait assez cool, car le ADD est lent aussi  :cry:


Message édité par iS@mi le 14-10-2003 à 16:25:58
n°539409
MagicBuzz
Posté le 14-10-2003 à 16:29:03  profilanswer
 

Nan, spa possible.
 
A moins de faire un insert d'un select. Mais il faut que tu es 250 lignes retournées par une requête :D

n°539417
iS@mi
Resistance is futile !
Posté le 14-10-2003 à 16:34:37  profilanswer
 

MagicBuzz a écrit :

Nan, spa possible.
 
A moins de faire un insert d'un select. Mais il faut que tu es 250 lignes retournées par une requête :D


suis prenneur.
Tu veux dire, créer un scrypt qui contient 250x la même ligne de code ?
 
Ca fait un peu gros mais si je peux gagner du temps, alors je  
 
Sinon, niveau performence, une requete INSERT est plus rapide qu'un ADD avec les SetFieldValue ?


Message édité par iS@mi le 14-10-2003 à 16:36:18
n°539420
MagicBuzz
Posté le 14-10-2003 à 16:38:09  profilanswer
 

non
 
insert into table2 (select * from table1)
 
Ca va recopier les lignes de table1 dans table2 (tu peux évidement mettre des filtres)
 
Ca te permettra de créer rapidement un grand nombre de lignes.
 
PS: par contre, il faut évidement que les champs de la table2 et les champs sélectionnés dans la sous-requête aient la même structure.


Message édité par MagicBuzz le 14-10-2003 à 16:38:20
n°539423
MagicBuzz
Posté le 14-10-2003 à 16:39:27  profilanswer
 

iS@mi a écrit :


Sinon, niveau performence, une requete INSERT est plus rapide qu'un ADD avec les SetFieldValue ?


Oui, et surtout, quelquesoit ton type de recordset, la donnée est instantanément écrite dans la base et visible par tous (sauf si tu es dans une transaction évidement), alors qu'avec un Add() selon le type de RS, les données ne seront pas transmises immédiatement au serveur.

n°539424
iS@mi
Resistance is futile !
Posté le 14-10-2003 à 16:39:41  profilanswer
 

Sinon, j'ai essayé d'utiliser Ado.net et ca bug méchament qd je passe en /clr, d'où l'impossibilité de l'utiliser  :cry:  :cry:

n°539427
MagicBuzz
Posté le 14-10-2003 à 16:40:33  profilanswer
 

/clr ?

n°539434
iS@mi
Resistance is futile !
Posté le 14-10-2003 à 16:48:57  profilanswer
 


 
Assembly Support dans la partie générale des préférences du projet dans Visual .net 2002.
 
The /clr compiler option enables the use of Managed Extensions for C++ and creates an output file that will require the .NET Framework common language runtime at run time. There may or may not be managed data in the application.
 
D'après mes recherches, je suis pas le seul à qui ca pose problème.

n°539436
iS@mi
Resistance is futile !
Posté le 14-10-2003 à 16:49:24  profilanswer
 

MagicBuzz a écrit :


Oui, et surtout, quelquesoit ton type de recordset, la donnée est instantanément écrite dans la base et visible par tous (sauf si tu es dans une transaction évidement), alors qu'avec un Add() selon le type de RS, les données ne seront pas transmises immédiatement au serveur.


 
Tant que tu m'en parles, j'ai ce problème :
 
J'ai une partie dans mon programme où le client rentre les repas dans un dialogue et durant toute l'ouverture de ce même dialogue, je ne referme pas mes tables pour éviter d'ouvrir et de refermer à chaque fois.
 
Le problème est que mon même programme ouvert sur une autre machine ne voit pas les changements fait tant que la table n'est pas refermée de l'autre côté, ce qui est gênant.
 
Egalement, qd j'utilise la requete tout effacer,  après plus loin dans mon code où j'utilise le delete pour une meilleur sélection, le programme ne voit pas que ces mêmes records ont été effacés et pourtant ca plante qd il veut les effacer ce qui est relativement normal puisqu'il n'existent plus (il les comptent voient via GetRecordsCount et pointe dessous avec MoveNext) ????
 
Enfin, je suis newbie dans ce domaine.
 
 

Code :
  1. Base_de_donnees.EffacerTousLesRepasViaRequete("Table" );
  2. if(Table.GetRecordCounts() > 0) // ils sont tjs là dans le RecordCount
  3. {
  4.   Table.MoveFirst();
  5.   while(!Table.isEof())
  6.   {
  7.      if(EffacerCeRecord)
  8.         Table.Delete();  // il l'efface alors qu'il n'existe plus
  9.      Table.MoveNext(); // il pointe dessus alors qu'il n'existe plus.
  10.   }
  11. }


Message édité par iS@mi le 14-10-2003 à 16:57:39
n°539667
R3g
fonctionnaire certifié ITIL
Posté le 14-10-2003 à 21:21:47  profilanswer
 

iS@mi a écrit :

Est-il possible en SQL d'ajouteur selon le nombre que l'on veut un même records en plusieurs examplaires ?
 
Style, ajouter 250x le même records :
 
 "INSERT INTO ma_table 250x (nom,message,date) VALUES ('Ingride','Message 4','lundi')";
 
Ca serait assez cool, car le ADD est lent aussi  :cry:


Et pour faire quoi ? Je suis pas un pro de la bdd, mais le seul truc que j'ai compris dans ce que mon prof me disait c'était : "il ne faut pas dupliquer les données pour éviter les erreurs !!!". A quoi ca peut servir d'avoir 250x le même enregistrement ???

n°539669
MagicBuzz
Posté le 14-10-2003 à 21:24:56  profilanswer
 

Regarde dans les propriétés de ton objet pour faire tourner le dataset côté serveur, et non côté client, et désactive le support transactionnel niveau ADO, et normalement ça devrait se mettre à jour.
 
Enfin... En fait tu devrais trouver l'info dans la doc de C#
 
Mais je ne maîtrise pas cette partie d'ADO. Moi je passe toujours par des recordset (et non des dataset). Perso, je préfère mille fois les reccordset, ça évite de bosser avec des données inutiles (au lieu de récupérer x fois toutes les lignes des tables, tu récupères le résultat d'un select bien formé, et tu peux mettre à jour le résultat du select... que demande le peuple)
 
PS: par contre, si tu bosses en mode connecté, c'est à dire que tu vois les modifs des autres utilisateurs, gare à la charge de la BDD et de la BP, c'est TRES consommateur. Donc très bien si tu as 20 personnes en intranet... Mais si t'as 500 personnes en VPN t'oublies carrément.

n°539670
MagicBuzz
Posté le 14-10-2003 à 21:27:10  profilanswer
 

R3g a écrit :


Et pour faire quoi ? Je suis pas un pro de la bdd, mais le seul truc que j'ai compris dans ce que mon prof me disait c'était : "il ne faut pas dupliquer les données pour éviter les erreurs !!!". A quoi ca peut servir d'avoir 250x le même enregistrement ???


ça peut servir à plein de choses : jeu de test, test de montée en charge, stress des règles d'intégritées en mode réel, etc.
 
quand t'as deux lignes dans ta base, tes tests ne servent à rien, car ne sont représentatifs de rien.
 
là notamment je pense que c'est à cause de ses tests de montée en charge... il veut tester si quand on efface 250 lignes ça prends 2 secondes ou 2 heures... pour ça faut avoir 250 lignes ;)

n°539678
R3g
fonctionnaire certifié ITIL
Posté le 14-10-2003 à 21:30:28  profilanswer
 

ah ok ok ok...

n°539946
iS@mi
Resistance is futile !
Posté le 15-10-2003 à 08:36:53  profilanswer
 

MagicBuzz a écrit :


....
là notamment je pense que c'est à cause de ses tests de montée en charge... il veut tester si quand on efface 250 lignes ça prends 2 secondes ou 2 heures... pour ça faut avoir 250 lignes ;)


 
C'est plus ou moins ca, je regarde combien de temps ca prend pour voir si je dois optimiser  mon code en fonction de certaines charges qui pourrait être demandées.
 
C'est un programme qui doit gérer des commandes repas de plusieurs dizaines de clients et j'ai calculé une moyenne de 27 repas commandés par client et par mois, ce qui fait au bout d'un an 300 records à charger (1 recors (6 fields) = 1 repas).
 
Comme c'est 300 records sont lourds pour le chargement et la sauvegarde, pour l'instant je ruse en ne chargeant que ce qui a besoin d'être chargés et de ce qui a besoin d'être sauvés (repas modifiés par exemple).
 
Problème, je connais pas trop bien la programmation sous Windows et encore moins access et c'est pas tjs très simple.
 
Pour montrer à quoi ca ressemble :
http://users.skynet.be/bk159638/Intro.gif


Message édité par iS@mi le 15-10-2003 à 08:37:33
n°539963
MagicBuzz
Posté le 15-10-2003 à 09:04:48  profilanswer
 

Je pense dons que l'utilisation de recordset serait la bienvenue en place de dataset.
 
En effet, j'ai bossé pour ma part sur ce site :
 
http://www.sodexhoeducation.com
 
Il permet aux écoles qui font appel à Sodexho dans le monde entier (chaque école disposant d'un sous-site paramétrable généré dynamiquement) de mettre à jour leurs menus et de vendre des recharges de tickets de cantine. La population est donc, comme tu l'imagines, suppérieure, par jour à ce que tu vendras en une année. Certes, vu qu'on ne vends que des recharges de cantine, on n'a pas à gérer l'achat de plats unitairement, mais le volume compense grandement cette simplicifation.
 
Et comme tu peux le constater, le site ne ramme pas, alors qu'il tourne sur un vulgaire serveur à 2000 ?.


Message édité par MagicBuzz le 15-10-2003 à 09:06:12
n°540616
iS@mi
Resistance is futile !
Posté le 15-10-2003 à 17:42:40  profilanswer
 

MagicBuzz a écrit :

Je pense dons que l'utilisation de recordset serait la bienvenue en place de dataset.
 
En effet, j'ai bossé pour ma part sur ce site :
 
http://www.sodexhoeducation.com
 
Il permet aux écoles qui font appel à Sodexho dans le monde entier (chaque école disposant d'un sous-site paramétrable généré dynamiquement) de mettre à jour leurs menus et de vendre des recharges de tickets de cantine. La population est donc, comme tu l'imagines, suppérieure, par jour à ce que tu vendras en une année. Certes, vu qu'on ne vends que des recharges de cantine, on n'a pas à gérer l'achat de plats unitairement, mais le volume compense grandement cette simplicifation.
 
Et comme tu peux le constater, le site ne ramme pas, alors qu'il tourne sur un vulgaire serveur à 2000 ?.


 
Ben c'est ce que j'utilise (CADORecordset)  :??:

n°540619
iS@mi
Resistance is futile !
Posté le 15-10-2003 à 17:46:16  profilanswer
 

Au sujet de ce que tu disais à propos des accès, en fait pour l'instant je ne travaille pas via des DSN mais via des chemins d'accès sur les bases de données (Provider=Microsoft.Jet.OLEDB.4.0;Data Source=BDD/Clients.mdb).
 
Edit: voilà, j'ai trouvé comment faire que les modifications soient vues directement.


Message édité par iS@mi le 15-10-2003 à 18:10:23
n°540744
MagicBuzz
Posté le 15-10-2003 à 19:51:36  profilanswer
 

Ca s'appelle une connexion OLE, ou OLEDB. C'est ce qu'il y a de plus performant parmis les outils ADO.

n°540753
drasche
Posté le 15-10-2003 à 19:55:58  profilanswer
 

roh comment ne l'ai-je vu plus-tôt, ce nickname sort tout droit de Star Trek [:meganne]
 
[/HS]


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°540771
iS@mi
Resistance is futile !
Posté le 15-10-2003 à 20:15:13  profilanswer
 

drasche a écrit :

roh comment ne l'ai-je vu plus-tôt, ce nickname sort tout droit de Star Trek [:meganne]
 
[/HS]


 
Oui qd j'ai vu citation personnelle, je me suis dis, qu'est ce que je vais bien pouvoir mettre  [:meganne]  :D  
Mais bon, je suis plus trop fan en ce moment car StarTrek c'est mort et je déteste Enterprise  (ZzzzzZzzzZZZzzz)  :fou:  
 
Enfin, c'est pas trop le sujet mais je ferai une recherche pour voir comment qu'on utilise des BDD via OLE pour le réseau.
Franchement, je pensais pas qu'il y avait autant de truc pour simplement gérer des bases de données  :D


Message édité par iS@mi le 15-10-2003 à 20:15:56
n°540792
drasche
Posté le 15-10-2003 à 20:29:15  profilanswer
 

je parlais de ton nickname, déjà plus difficile à faire un lien si on connaît pas bien le domaine :D (la citation, clair que c'est connu :o)
 
les bases de données, on n'a jamais dit que c'était simple hein :D
Les BDD via le réseau, pas compliqué, une interface en ADO avec support ODBC derrière, ya tout ce qu'il faut, j'ai un mini exemple de récupération de données dans la FAQ VB (un jour, faudra que je montre les recordsets déconnectés :o)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°540869
iS@mi
Resistance is futile !
Posté le 15-10-2003 à 21:38:49  profilanswer
 

drasche a écrit :

je parlais de ton nickname, déjà plus difficile à faire un lien si on connaît pas bien le domaine :D (la citation, clair que c'est connu :o)
 
les bases de données, on n'a jamais dit que c'était simple hein :D
Les BDD via le réseau, pas compliqué, une interface en ADO avec support ODBC derrière, ya tout ce qu'il faut, j'ai un mini exemple de récupération de données dans la FAQ VB (un jour, faudra que je montre les recordsets déconnectés :o)


 
Ha bon, un lien avec quoi (nickname) ????
 

n°540871
drasche
Posté le 15-10-2003 à 21:44:11  profilanswer
 

Isami, c'est le surnom donné par Deanna Troi à Will Riker (à une époque antérieure à TNG)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°540877
iS@mi
Resistance is futile !
Posté le 15-10-2003 à 21:51:20  profilanswer
 

drasche a écrit :

Isami, c'est le surnom donné par Deanna Troi à Will Riker (à une époque antérieure à TNG)


 
Ha ben quel hazard, ca avait strictement rien avoir (Sami ca vient de mon non de famille samyn et le i devant c'était à l'époque de la mode de l'iMac de mettre plein de i partout)  :D

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [MFC] ADO est trop lent !

 

Sujets relatifs
[VC++] pb activeX sans MFC![MFC] Transparence de mes contrôles dans un CTabCtrl
[C/C++ Win32] Arrêt du support des MFC...SVG 1.1 et xlink : pourquoi c'est plus lent ? [Résolu]
[MFC] tuto debutant![MFC] Supprimer les boutons toolbar
[MFC] Edit: Envoie d'un message vers mes Dialogues..Recordset ADO et DataGrid... Aidez moi!!!
[MFC] imprimer la vueSystray Icon en MFC
Plus de sujets relatifs à : [MFC] ADO est trop lent !


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR