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 :

Tentative d'appel de Read non valide lorsque le lecteur est fermé


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mai 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2012
    Messages : 6
    Par défaut Tentative d'appel de Read non valide lorsque le lecteur est fermé
    EDIT de Sankasssss : Discussion provenant de cette discussion ayant été cloturée : Combobox et access


    Salut tous le monde

    Pouviez vous me dire pourquoi y a un problème dans votre code que j'ai modifier que le "PROVIDER" comme suit:

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Imports System.Data.OleDb
    Imports System.Data
    Imports System.Data.SqlClient
     
    Public Class Form1
     
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
            remplirCombo(chargementBDD)
        End Sub
     
        Private Sub remplirCombo(ByVal dr As OleDbDataReader)
     
            Using dr
     
                While dr.Read()
                    ComboBox1.Items.Add(dr("NOperations").ToString)
                End While
     
            End Using
     
        End Sub
     
        Private Function chargementBDD() As OleDbDataReader
            Dim Mycommand As OleDbCommand
            Dim MyConnexion As OleDbConnection = New OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source =F:\Contacts.mdb")
     
            Try
                Using MaConnexion
                    MyConnexion.Open()
                    Mycommand = New OleDbCommand("SELECT NOperations FROM Amis", MaConnexion)
                    Return Mycommand.ExecuteReader
                End Using
            Catch ex As Exception
                MsgBox(ex.ToString)
                Return Nothing
            End Try
     
        End Function
    End Class
    l’Erreur est déclarée à la ligne While dr.Read()

    -L'exception InvalidOperationException n'a pas été gérée
    -Tentative d'appel de Read non valide lorsque le lecteur est fermé.

    Merci

  2. #2
    Membre Expert Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Par défaut
    C'est bizarre selon ton code pour moi il devrait planter à cette ligne-là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       Mycommand = New OleDbCommand("SELECT NOperations FROM Amis", MaConnexion)
    Car tu t'es mélangé entre MaConnexion et MyConnexion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Function chargementBDD() As OleDbDataReader
            Dim Mycommand As OleDbCommand
            Dim MyConnexion As OleDbConnection = New OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source =F:\Contacts.mdb")
     
            Try
                Using MaConnexion
                    MyConnexion.Open()
                    Mycommand = New OleDbCommand("SELECT NOperations FROM Amis", MaConnexion)

  3. #3
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mai 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2012
    Messages : 6
    Par défaut
    Citation Envoyé par _Ez3kiel Voir le message
    C'est bizarre selon ton code pour moi il devrait planter à cette ligne-là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       Mycommand = New OleDbCommand("SELECT NOperations FROM Amis", MaConnexion)
    Car tu t'es mélangé entre MaConnexion et MyConnexion :
    Merci Ez3kiel, j'ai remarqué le problème de la fausse déclaration de la variable MaConnexion que j'ai corrigé,
    Avec toutes mes excuses le problème est le même. je pense que c'est à cause que je ne maitrise pas encore Les FONCTIONS... chargerBDD() c'est là mon problème ? je devrais me documenté sur le pourquoi et comment des FONCTIONS.

  4. #4
    Membre Expert Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Par défaut
    Se documenter n'est jamais du temps perdu.

    Mais ne te blâme pas, ici c'est moi qui ai fait l'erreur , j'avais omis la relation du reader et de sa connexion ... Un OleDbDataReader a besoin de sa connexion active pour être parcouru (.Read()).

    On va ouvrir notre connexion dans le load, la passer en paramètre le temps de la lecture et de l'ajout des champs, puis on la ferme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim MyConnexion As OleDbConnection = New OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source =F:\Contacts.mdb")
     
            Try
                Using MyConnexion
                    MyConnexion.Open()
                    remplirCombo(chargementBDD(MyConnexion))
                End Using
     
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
        End Sub
    Ainsi on va modifier un peu les bêtises que j'ai écris plus haut ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       Private Function chargementBDD(myconnexion As OleDbConnection) As OleDbDataReader
            Dim Mycommand As OleDbCommand
            Try
                Mycommand = New OleDbCommand("SELECT NOperations FROM Amis", myconnexion)
                Return Mycommand.ExecuteReader
     
            Catch ex As Exception
                MsgBox(ex.ToString)
                Return Nothing
            End Try
     
        End Function
    Et du fait que si il y a une erreur on return Nothing, il faut aussi penser à le tester dans remplirCombo(dr as oledbdatareader)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Private Sub remplirCombo(ByVal dr As OleDbDataReader)
            Using dr
                If dr IsNot Nothing Then
                    While dr.Read()
                        ComboBox1.Items.Add(dr("NOperations").ToString)
                    End While
                End If
            End Using
        End Sub
    "En théorie", ça devrait être bon maintenant.

    Mea Culpa pour les erreurs, et si des membres ont d'autres idées pour optimiser ou rendre le code plus "propre", je suis toute ouïe !

    Nb : Comment j'ai pu avoir autant de pouces verts avec un code non fonctionnel ?

  5. #5
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mai 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2012
    Messages : 6
    Par défaut
    Citation Envoyé par _Ez3kiel Voir le message
    Se documenter n'est jamais du temps perdu.

    Mais ne te blâme pas, ici c'est moi qui ai fait l'erreur , j'avais omis la relation du reader et de sa connexion ... Un OleDbDataReader a besoin de sa connexion active pour être parcouru (.Read()).
    çA MARCHE, j'ai collé ton code dans "Form1.Designer.vb" c'est parfait, mais pas dans Form1.vb ? c'est ma mission aujourd'hui de comprendre cette différence

    Grand merci à toi Ez3kiel

  6. #6
    Membre Expert Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Par défaut
    En théorie on n'a pas à intervenir sur Form.Designer.Vb, c'est la partie à Windows ça ! Lorsque tu trafique ton interface en déplaçant des boutons etc, derrière "en caché", windows s'occupe de générer le code qui dit que ton bouton se trouve désormais à la position(x,y), qu'il est bleu, que son texte est "Clic moi dessus" etc. Bref, on touche pas sinon tu auras de mauvaises surprises après ... (Le moment venu tu sauras pourquoi et comment y toucher, mais en général on évite)

    Ton code à toi, dans notre cas, doit se trouver dans Form1.vb !

    A la rigueur, plutôt que de copier/coller des bouts de code sans savoir comment ni pourquoi ça marche (et avec des copier/coller sans comprendre, ça ne marchera souvent pas), tu devrais apprendre à coder ces "bouts de code".
    Je te conseille pour ça le cours de P.Lasserre sur le Vb.NET qui est très bien fourni et explique tout ce qu'il y a à savoir : http://plasserre.developpez.com/cours/vb-net/

  7. #7
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mai 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2012
    Messages : 6
    Par défaut
    Citation Envoyé par _Ez3kiel Voir le message

    Dans un premier temps, on retirer ton code de Form1_load pour le mettre dans une fonction à part qui nous retournera un reader. (Ainsi si dans le futur tu souhaites remplir ta combo au click d'un bouton ou autre, tu n'auras plus qu'à récupérer les données que te renvois ta fonction)
    Egalement on va créer une procédure qui prendra en paramètre notre reader pour remplir la combobox.
    Et voilà! J'ai pas suivi ta premières consigne, j'ai tout balancer dans Form1_load, grrrrrrrrrr!!! d'oû l'origine du problème.

    C'est en forgeant qu'on devient forgeron.

  8. #8
    Membre Expert Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Par défaut
    Citation Envoyé par autodidacte3 Voir le message
    Et voilà! J'ai pas suivi ta premières consigne, j'ai tout balancer dans Form1_load grrrrrrrrrr d'oû l'origine du problème.

    C'est en forgeant qu'on devient forgeron.
    Non ce n'est pas l'origine du problème, le problème était que je fermais la connexion avant de parcourir le reader, et qu'il a besoin d'avoir sa connexion active pour être parcouru.

    Mais ce n'est pas pour autant qu'il faut remettre le code dans le load, ce n'est pas très propre/lisible, et selon Pol63 ça absorberait des erreurs (je ne l'affirme pas car je n'ai pas eu l'occasion de le démontrer). Et si un jour tu as besoin de la fonction chargementBDD() ou remplircombo(), tu seras content que ces fonctions soient déjà codées et prêtes à l'emploi, plutôt que de devoir dupliquer le code que tu aurais mit dans Form_load pour t'en servir ailleurs.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/05/2015, 01h31
  2. Réponses: 3
    Dernier message: 30/01/2011, 14h14
  3. Réponses: 3
    Dernier message: 28/08/2009, 13h30
  4. catcher lorsque le curseur est ferme
    Par mikees dans le forum PL/SQL
    Réponses: 11
    Dernier message: 18/03/2009, 20h45
  5. Réponses: 7
    Dernier message: 19/10/2007, 14h24

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