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

Accès aux données Discussion :

[ADO.Net][VB.Net] Quel est l'équivalent du RecordSet ? [Débutant(e)]


Sujet :

Accès aux données

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 231
    Points : 165
    Points
    165
    Par défaut [ADO.Net][VB.Net] Quel est l'équivalent du RecordSet ?
    Bonjour, je voudrai savoir si le datareader sous .net était l'équivaleur du recordset sous Vb6 ? si non, quel est son équivalent ?

    Jusqu'à maintenant j'utilise un datareader pour y lire les données retournées par une requête SQL... Le hic c'est que je ne peux ouvrir 2 datareader en même temps (ex: parcourir un premier datareader, puis ouvrir un second pour faire des traitements à côté qui nécessite des infos du 1er datareader). Pour l'instant je contourne le problème en placant les résultats du 1er datareader dans un tableau avant d'ouvrir le second....

  2. #2
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 113
    Points : 118
    Points
    118
    Par défaut
    tu peux utiliser le DataSet qui l'équivalent du recordSet VB6 mais en nettement améliorer.

    Il s'utilise à l'aide d'un DataAdpater ( et une (SQL)Command).
    Pour remplir ton DataSet tu utilise la méthode Fill de ton DataAdpater qui reçois en paramètre ton DataSet.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 231
    Points : 165
    Points
    165
    Par défaut
    ok donc c'est plus juste que d'utiliser un datareader comme équivalent du recordset ?

  4. #4
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Non non...Le DataReader est plus proche de l'ancien Recordset que ne l'est le DataSet.

    Le problème que tu rencontres est au niveau de la connection. Bien que ta technique soit tout à fait valable, tu peux aussi ouvrir une seconde connexion et donc avoir une nouveau datareader.

    Mais pour te conseiller la solution optimale, il faudrait savoir quel genre de traitement tu effectues.

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 113
    Points : 118
    Points
    118
    Par défaut
    Non non chaque composant à son utilité

    Le dataReader est rapide, mais bloque la connexion il est très utilise pour remplir des liste ( listbox, comboBox, Treeview, ... ). on dit que tu travailles en mode connecté

    Le DataSet te permet de travailler sur tes données en mode deconnecté. tres utile pour l'affichage dans une grid par exemple.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 231
    Points : 165
    Points
    165
    Par défaut
    donc pour vous résumer le contexte que voici :
    - j'ai une requête qui retourne plusieurs enregistrement
    - je récupère l'id et un autre id de clé étrangère de chacun de ces enregistrements
    - je boucle sur chacun de ces enregistrements et à chaque fois j'ai une 2è requête qui s'éxecute sur l'id de la clé étrangère et juste après ça je supprime l'enregistrement lu

    ça ne peut pas être fait d'une requête, je dois parcourir chacun des enregistrements

    que me conseillez vous ?

    ça se fait d'ouvrir une 2e connexion sur la meme base de données uniquement pour ouvrir un second datareader ?

  7. #7
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Citation Envoyé par prophetky
    Non non chaque composant à son utilité
    Je n'ai pas dis le contraire

    Citation Envoyé par prophetky
    Le dataReader est rapide, mais bloque la connexion il est très utilise pour remplir des liste ( listbox, comboBox, Treeview, ... ). on dit que tu travailles en mode connecté

    Le DataSet te permet de travailler sur tes données en mode deconnecté. tres utile pour l'affichage dans une grid par exemple.
    Je ne vois aucune différence entre remplir une "listbox" ou une "grid", désolé.

    On ne va pas refaire le débat Datareader/DataSet, je crois qu'on a fait largement le tour...Juste pour info, un DataSet utilise un DataReader pour obtenir ses données, donc je persiste : choisir entre l'un ou l'autre dépend majoritairement du traitement que l'on souhaite faire sur les données.

    J'irais même plus loin : étant donnée la lourdeur du DataSet, il y a bien des cas ou la méthode de dinbougre (placer temporairement les données dans un tableau et ouvrir un autre reader) est la meilleure en terme de performances.

  8. #8
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Bonjour dinbougre

    Je rejoins absolument toutes les remarques et suggestions de Keihilin.
    Cependant, il me semble que tu as besoin de preciser un autre aspect qui est:
    As-tu la possiblité de faire des modifications au sein même de la base de données. Je soupçonne en effet, qu'une partie de ce que tu veux faire pourrait être traité côté SGBDR (vues, procedure stockées). De plus quel est le SGBD concerné dans ton cas :

  9. #9
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Citation Envoyé par dinbougre

    - je récupère l'id et un autre id de clé étrangère de chacun de ces enregistrements
    - je boucle sur chacun de ces enregistrements et à chaque fois j'ai une 2è requête qui s'éxecute sur l'id de la clé étrangère et juste après ça je supprime l'enregistrement lu

    ça ne peut pas être fait d'une requête, je dois parcourir chacun des enregistrements
    A vu de nez (mais sans garantie), ça doit pouvoir se faire un 2 requêtes, pas plus. Il y a juste la suppression qui doit être fait dansun second temps.

    Est-ce que tu peux nous donner la structure de tes tables ?

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 231
    Points : 165
    Points
    165
    Par défaut
    donc c'est une base de données sous access.

    maTable1 (t1) : t1_id, t1_nbr
    maTable2 (t2) : t2_id, t1_id
    maTable3 (t3) : t3_id, t3_nbr

    Je veux supprimer un élément de t1, ce qui implique de supprimer tous les éléments dans t2 liés à un t1. De plus il faut que je mette à jour dans t3 le champ t3_nbr en lui retirant t1_nbr car supprimé (t3_nbr = t3_nbr - t1_nbr)

    J'ai t1_id à supprimer.
    J'ouvre un recordset sur t2 où t1_id = l'id à supprimer
    Je parcours tout ça via une boucle tant qu'il y a des enregistrements.
    Ensuite à chaque tour de boucle j'ouvre un autre dataread qui va chercher lire dans t3 la valeur de t3_nbr pour faire des vérifs et ensuite lui retrancher t1_nbr et c'est au moment où je dois le lire que j'ouvre le second datareader qui gêne.

    J'ai conscience que je peux passer par des requêtes dans access mais j'avais envie de tout centrer dans mon appli, c'est mal ?

  11. #11
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Ok, je pense avoir à peu prêt compris.

    Une dernière question et je te fais une proposition de code : est-ce que tu dois absolument lire t3_nbr ? Qu'est-ce que tu fais de cette valeur pendant ton traitement ?

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 231
    Points : 165
    Points
    165
    Par défaut
    En fait j'ai légèrement simplifié le truc.
    Normalement il y a une autre table intercalé qui fonctionne pareil avec des suppressions en cascade.
    C'est pas le t3_nbr que je lis normalement, je voulais juste ne pas détailler les 4 tables

    Je sais que je peux utiliser la suppression en cascade d'access mais ce truc me fait peur en cas de mauvaise manip, il risque de tout supprimer.

    Je viens de ressortir des classeurs que je m'étais fait des différents tutoriaux sur ado.net dont celui de developpez.com. A l'époque j'avais vaguement assimilé la théorie des dataset, datareader, dataadatapter, datatable... mais maintenant que je commence à plus utiliser dotnet je vais peut être mieux comprendre.

    C'est ok pour ma description ou je n'ai pas été clair encore ?

  13. #13
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Ne t'inquiète pas, on va se passer de la suppression en cascade.
    Mais s'il y a encore une autre table incluse dans le traitement, merci de complèter ta description.

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 231
    Points : 165
    Points
    165
    Par défaut
    Ok je re détaille mieux.

    maTable1 (t1) : t1_id, t1_nbr
    maTable2 (t2) : t2_id, t1_id
    maTable2 (t3) : t3_id, t2_id
    maTable3 (t4) : t4_id, t4_nbr

    Je veux supprimer un élément de t1, ce qui implique de :
    => supprimer tous les éléments dans t2 liés au t1 supprimé
    => supprimer tous les éléments dans t3 liés au t2 supprimé

    Donc je supprime un enregistrement 'dans t1 qui entraine la suppression en cascade des t3 rattachés aux t2 rattachés au t1 supprimé.
    Au final je met à jour t4_nbr auquel je retranche t1_nbr supprimé (t4_nbr = t4_nbr - t1_nbr)

    Pour faire cela, j'ouvre un recordset Rs1 sur t2 des enregistrements à supprimer dans t2. J'ouvre un recordset Rs2 sur les t3 des enregistrements à supprimer dans t3 liés aux t2 supprimés. Là ça coince.

    Et pour finir je dois mettre à jour t4_nbr mais là il n'y a pas de problème

  15. #15
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Bon, je ferais ça comme ça :

    Récupération de t1_nbr avec un datareader.

    Ouverture d'une transaction

    Un ExecuteNonQuery avec la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    delete t3
    where t2_id in (select t2_id from t2 where t1_id=@t1_id)
    je suppose que tu sais utiliser les paramètres (est-ce que c'est bien @ pour Access ??)

    Un ExecuteNonQuery avec la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    delete t2
    where t1_id = @t1_id
    L'update, toujours avec un ExecuteNonQuery()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    update t4
    set t4_nbr = t4_nbr - @t1_nbr
    t'as plus qu'à faire le delete de t1 et à valider la transaction.

    pas besoin de dataset...

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 231
    Points : 165
    Points
    165
    Par défaut
    ok merci

    mais si jamais un cas se produit où il est vraiment indispensable d'avoir 2 requêtes SELECT ouvertes en même temps... faudra que j'utilise un dataset alors ?

  17. #17
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Oui, ou alors un DataTable (plus léger). Cela dit, ta méthode de tableau temporaire est parfaitement valable, surtout si c'est juste pour conserver des id.

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 231
    Points : 165
    Points
    165
    Par défaut
    ok merci

    je trouvais, a tord apparement, que c'était lourd comme code avec le tableau

    merci à tous, je le flag en [résolu]

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

Discussions similaires

  1. [VB6/VB.Net] Quel est l'équivalent de l'expression Mid ?
    Par bentley71de dans le forum VB.NET
    Réponses: 5
    Dernier message: 11/09/2008, 14h07
  2. Réponses: 2
    Dernier message: 08/09/2006, 18h59
  3. [VB.NET] Quel est l'équivalent du StringTokenizer JAVA ?
    Par Benzeghiba dans le forum VB.NET
    Réponses: 3
    Dernier message: 14/05/2006, 17h36
  4. [C#] Quel est l'équivalent du MyClass VB.Net ?
    Par prophetky dans le forum C#
    Réponses: 5
    Dernier message: 12/05/2006, 14h32
  5. [VB.Net > C#] Quel est l'équivalent de CType ?
    Par igorzup dans le forum VB.NET
    Réponses: 2
    Dernier message: 11/05/2006, 15h38

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