Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Travailler en asynchrone avec un recordset ADO [ Base de données / ADO & DAO ] (deathsender)

jeudi 21 août 2008 à 14:15:16 | Travailler en asynchrone avec un recordset ADO

deathsender

Bonjour à tous,

J'expérimente actuellement l'ouverture générique (requête et arguments d'ouvertures variables) en asynchrone d'un recordset ADO attaquant une base SQL Server (sous VB6).
Tout fonctionne correctement (l'appli n'est pas suspendue pendant le traitement de la requête et le retour des enregistrements par le serveur), mais il me manque une information importante : le nombre d'enregistrements total retournés par la requête, avant même le chargement des enregistrements du coté client.
En effet, j'avais imaginé pouvoir afficher le pourcentage de récupération des enregistrements, histoire d'assurer un minimum de transparence pour l'utilisateur.
J'ai essayé diverses méthodes, mais aucune ne m'a permit de récupérer la précieuse information, à savoir :
- interrogation de RecordCount au premier évènement FetchProgress => provoque le chargement total du recordset en mode synchrone... (ma foi c'est logique)
- concaténation de "; PRINT @@ROWCOUNT" à la suite de la chaine SQL, dans le but de provoquer une erreur voulue, mais cette erreur ne se produit jamais (d'ailleurs, la concaténation de "; PRINT 1/0" ne provoque aucune erreur non plus... j'en conclu donc que la méthode Open s'arrête au premier lot de la chaine SQL contenant une clause SELECT)
- utilisation de la méthode Execute de l'object Connection en asynchrone, à la place de Open du recordset, d'une part pour tenter d'utiliser l'argument par référence RecordsAffected (ne fonctionne pas); et d'autre part de récupérer @@ROWCOUNT part la concaténation de "; SELECT ROWCOUNT" à la fin de la chaine contenant la requête, mais ça ne marche pas non plus.

J'avoue arriver un peu à court de solutions, et apprécierait grandement vos avis experts

jeudi 21 août 2008 à 14:47:45 | Re : Travailler en asynchrone avec un recordset ADO

LIBRE_MAX

Réponse acceptée !
Salut,
Pourquoi pas  Select COUNT(ClePrimaire) from... 
avant le chargement des enregistrements ?

... Y'en a même qui disent qu'ils l'ont vu voler.

jeudi 21 août 2008 à 14:55:52 | Re : Travailler en asynchrone avec un recordset ADO

deathsender

J'y avais pensé, en effet, mais cette solution n'est pas sans inconvénients :
- on a donc deux requêtes exécutées dans deux lots différents, par conséquent le nombre d'enregistrements comptés peut différer entre les deux résultats (accès concurrentiel oblige).
- dans le cas où l'analyse de la requête par le serveur est assez long, on va donc doubler le temps d'attente du coté de l'application cliente.

jeudi 21 août 2008 à 15:16:58 | Re : Travailler en asynchrone avec un recordset ADO

LIBRE_MAX

oui j' ai compris ton soucis ;
Alors il y' a peut être une solution rocambolesque :-)
Elle consiste à passer ta requete selection comme une requete regroupement sur cle primaire en premier et First pour le reste.
Et en dernier Count(ClePrimaire).
Tu auras ainsi combiné les deux:
Retour des enregistrements et et total des enregistrements.
Si ça ne marche pas, retour à la première solution avec execution de la requete (Count)  tout les n secondes.


... Y'en a même qui disent qu'ils l'ont vu voler.

jeudi 21 août 2008 à 16:06:38 | Re : Travailler en asynchrone avec un recordset ADO

deathsender

Hum... tu m'as l'air au moins aussi tordu que moi ^^
Ton idée est intéressante, mais inapplicable dans mon cas, ma fonction devant rester générique au niveau des requêtes, on a pas forcément de clé primaire (certaines requêtes imbriquées, multi-niveaux (MSDataShape)). Et surtout.. le résultat de la requête doit demeurer conforme à ce qui est demandé par la requête d'origine.
Personnellement, j'avais pensé à un moment faire un INSERT dans une table temporaire pour interroger son count, puis renvoyer son contenu à l'aide d'un SELECT, mais cette voie ressemble plus à une usine à gaz qu'à autre chose.
Tout bien réflechi, ce total que je cherche à récupérer est une information simplement indicative pour afficher un pourcentage d'exécution, et étant donné que la plupart du temps il sera exact en utilisant ta première solution, je pense que je vais l'adopter.
En te remerciant encore de ton aide.. :)



Cette discussion est classé dans : ado, recordset, enregistrements, requête, asynchrone


Répondre à ce message

Sujets en rapport avec ce message

recordset ADO (Nombre total d'enregistrements d'un recordset) ?? [ par steph ] je cherche a connaitre les nombre total d'enregistrements que me renvoi un recordset ADOj'essaye MonRecordset.recordCount mais il me renvois toujour e Suppressions d'enregistrements avec ADO [ par lebalrog ] Salut a tous! Je fais une appli qui gere entre autre un base de donnee access, et je voudrais supprimer des enregistrements (ceux ki deviennent inutil ADO Recordset [ par ricomiracle ] Est il possible de faire une requête sur un objet Recordset?Le recordset est initialisé par une requête sur une base de donnée:Select * from MyTableJe Requête ADO en VBA [ par DevConf ] Bonjour,Je développe actuellement un add-in Outlook communiquant avec une base de données Access.J'ai fait une requête SELECT qui marche très bien.Je ADO Requête 2 [VB6] [ par kirikou95 ] Bonjour,Soit: Base : Gestion.mdbTable : Utilisateur(Numero,Login, Nom, Prenom)J'ai créé une form pour créer un utilisateur. Je voudrais lui dire que s VB.Net Requête SQL pour ADO.Net [ par MagDix ] BonjourJe susi entrain d'essayé de faire une Requête SQL toute simple afin de mettre tout les lignes qui contienne un astérix dans une certain colonne VB.Net Ado Requête SQL Problème [ par JeffC1977 ] Salut..J'ai un problème avec un requête simple SQL.. J'utilise VB.Net et ADO.Net.Cette requête fonctionnait correctement jadis et je dois avoir un err Recordset ADO pour MYSQL avec vb6 [ par djtrefle ] Bonjour, je gere une table (qui s'appelle "field") qui contiens les champs suivant : Num ID Field1 Field2 Field3 ... Field20 Ce que je voudrais faire


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Appels d'offres

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,250 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.