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

VB.NET Discussion :

Problème de DataReader sous SQL 2008 R2


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2008
    Messages : 121
    Points : 84
    Points
    84
    Par défaut Problème de DataReader sous SQL 2008 R2
    Bonjour,
    Je sais pas trop si je suis au bon endroit, mais j'ai une problématique et j'aimerais savoir si vous avez déjà eu ce cas et si oui si vous avez une solution.

    Pour un projet de conversion de donnée je me connecte a une base SQL 2008 R2.

    Ma problématique est que lorsque j'arrive a mon second DataReader (instruction ligne 12) j'obtiens l'erreur suivant
    Un DataReader associé à cette commande est déjà ouvert. Il doit d'abord être fermé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    Using ludikDB As New SqlConnection(connexionString)
    	ludikDB.Open()
    	Dim rp As SqlDataReader = (New SqlCommand(String.Format(qry, personFields), ludikDB)).ExecuteReader()
    	While rp.Read()
    		Dim pId As Integer = rp.GetInt32(0)
            qry = <sql>SELECT p.id, t.TEL
    			FROM TEL t
    				LEFT JOIN [dbo].PERSON_ID p ON t.NO_CLE_TEL=p.no_pers
    			WHERE t.PROV_TEL=3 AND p.id=<%= pId %></sql>.Value
     
    		Dim rphones As SqlDataReader = (New SqlCommand(qry, ludikDB)).ExecuteReader()
    		While rphones.Read()
    			person.Phones.Add(New ImportedPerson.ImportedPhone() With {
    					.number = rphones.GetString(2),
    					.category = rphones.GetInt32(1),
    					.correspondance = (person.Phones.Count = 0)
    				})
    		End While
    		rphones.Close()
    		{...}
    	End While
    End Using
    C'est en théorie normal, vu que mon DataReader n'est pas fermé. Je pourrais obtenir mon premier résultat dans une liste. Puis recommencer le traitement.

    Cependant, si je passe la même BD sous SQL Server 2012, le même code passe sans aucun problème ? Est-ce dû a une configuration quelconque que je pourrais setter sous 2008 R2 ? Ou est-ce seulement que 2012 effectue le traitement d'une manière différentes?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    327
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 327
    Points : 402
    Points
    402
    Par défaut
    Bonjour,
    Je dis peux être des bêtises car c'est un peu loin pour moi. Donc les informations si dessous sont à prendre avec des pincettes.
    Pour moi il faudrait ouvrir une deuxième connexion car on ne peut exécuter qu'une requête à la fois par connexion.

    Je ne connais pas la raison exact de pourquoi le code fonctionne en SQL Serveur 2012 mais en attendant quelqu'un de plus compétent, je te conseille d'ouvrir une deuxième connexion.

    Bonne journée et bon code.

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2008
    Messages : 121
    Points : 84
    Points
    84
    Par défaut
    Oui c'est bien le cas normalement, tu ouvre une connexion, si tu as besoin d'une secondes tu dois fermer la première et ainsi de suite.

    Cependant, je me questionne quand même sur le pourquoi en SQL 2012 le traitement semble différent. Surtout que dans notre application, nous avons parfois des erreurs des DataReader (probablement car certains connexion ont été oublié, mais vu que c'est une application qui date du début des années 2000, et que nous sommes soit en SQL, soit avec un vieil orm est en J# et qu'on ne peut pas modifier pour mieux valider xD)

    Je me demande quand même si ça vient du config ou autre

    Le problème a toujours devoir fermer. C'est lorsqu'on tu as besoin accéder a quelques chose en étant dans une boucle.

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par mat1554 Voir le message
    Cependant, si je passe la même BD sous SQL Server 2012, le même code passe sans aucun problème ?
    C'est etrange ! Est-ce que la connection string est strictement la meme dans les 2 cas (sous SQL Server 2008 R2 et 2012) ?

    Est-ce que tu as des donnees dans la base SQL Server 2012 ? Car si tu ne rentres pas dans le premier While rp.Read(), c'est normal que le probleme n'apparaisse pas.

    Citation Envoyé par mat1554 Voir le message
    Est-ce dû a une configuration quelconque que je pourrais setter sous 2008 R2 ? Ou est-ce seulement que 2012 effectue le traitement d'une manière différentes?
    Je ne pense pas.

    Citation Envoyé par mat1554 Voir le message
    Le problème a toujours devoir fermer. C'est lorsqu'on tu as besoin accéder a quelques chose en étant dans une boucle.
    C'est plutot un probleme de conception. La regle est de toujours fermer et de rouvrir lorsque necessaire. Le pool de connexion de SQL Server se charge de gerer les connexions (en realite il ne les ferme pas toutes, il en garde certaines ouvertes pendant un certain temps pour ne pas ajouter l'overhead de la creation de la connexion a chaque fois).
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2008
    Messages : 121
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par DotNetMatt Voir le message
    C'est etrange ! Est-ce que la connection string est strictement la meme dans les 2 cas (sous SQL Server 2008 R2 et 2012) ?

    Est-ce que tu as des donnees dans la base SQL Server 2012 ? Car si tu ne rentres pas dans le premier While rp.Read(), c'est normal que le probleme n'apparaisse pas.
    Pour ma 2012 : Data Source=.\SQLEXPRESS;Initial Catalog=ludikImport;User ID=act_test;Password=act_test;MultipleActiveResultSets=True
    Pour ma 2008 : Data Source=D1JCM02\D1JCM02;Initial Catalog=ludikImport;User ID=act_test;Password=act_test; MultipleActiveResultSets=True


    Sinon oui il s'agit de la même source de donnée. La BD "LudikImport" est rempli de la même façon avec la même base CSV dans les 2 cas.

    Citation Envoyé par DotNetMatt Voir le message
    C'est plutot un probleme de conception. La regle est de toujours fermer et de rouvrir lorsque necessaire. Le pool de connexion de SQL Server se charge de gerer les connexions (en realite il ne les ferme pas toutes, il en garde certaines ouvertes pendant un certain temps pour ne pas ajouter l'overhead de la creation de la connexion a chaque fois).
    Ouais c'est bien ce que je me disais ou comprenais. Même si parfois dans un autre scénario que celui que je cherche le pourquoi actuellement. Nous avons les erreur de DataReader qui peuvent se produire 1 fois sur 100 dans le même bout de code xD Mais là, ça vient de mon ORM selon moi donc ...

Discussions similaires

  1. Probléme d'éxecution sous vb(2008)
    Par chahinaz21 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/11/2009, 20h25
  2. problème crystal report sous vs 2008
    Par polo86 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 04/05/2009, 11h00
  3. Problème de performances sous SQL Server 2000
    Par Shuret dans le forum MS SQL Server
    Réponses: 22
    Dernier message: 22/10/2008, 15h09
  4. probléme d'identification sous sql*plus
    Par michouhayoo dans le forum Débuter
    Réponses: 1
    Dernier message: 25/03/2008, 15h27

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