Fermeture de datareader inefficace

Signaler
Messages postés
37
Date d'inscription
lundi 7 juillet 2008
Statut
Membre
Dernière intervention
14 mars 2011
-
alexandreillusion
Messages postés
37
Date d'inscription
lundi 7 juillet 2008
Statut
Membre
Dernière intervention
14 mars 2011
-
bonjours a toutes et a tous,

je suis en train de créer un programme de GMAO et dans une fenetre il y a deux listbox et deux radio box.
les radio box permettent de choisir les données que j'insère dans ma première list box a travers un datareader.
la seconde liste box se remplis lors du chois d'un item dans la première listbox qui fait office de filtre en quelque sorte.
mon problème est que lorsque lle programme cherche a remplir la seconde listbox, il me dit qu'un datareader associé à cette commande est déjà ouvert. Il doit d'abord être fermé. ce data reader et cette commande a été ouverte dans l'import des données dans la premiere list box (executer a traver la radiobox). seulement je pense bien avoir fermé cedatareader au bon moment. aurais-je oublier quelque chose mais quoi?
voici le bout de code:

d'abord pour remplir la premiere listbox:

  Private Sub rbApprovisionnement_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles rbApprovisionnement.Click

        Dim strConn As String 'déclare la connection et la requete sous string
        Dim i As Integer  'declare le compteur pour l'incrémentation pour afficher l'enregistrement suivant dans le combo box
        Dim a As String 'declare le string pour comparaison des deux requete ancienne et nouvelle (voir plus loin)

        strConn = "provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=./base pour GMAO.mdb;" 'met les carac dans la var string

        Dim connaccess As New OleDb.OleDbConnection(strConn) 'declare la connection la connection
        connaccess.Open() 'execute la connection

        'insertion des piece dans la listbox

        Dim macommande As OleDbCommand = connaccess.CreateCommand
        macommande.CommandText = "SELECT pièces FROM pièces"
        Dim myreader As OleDbDataReader = macommande.ExecuteReader

        Do While myreader.Read
            If (myreader.GetValue(0)) Is DBNull.Value Then GoTo nex
            If (myreader.GetValue(0)) = a Then
                GoTo nex
            Else
                cbPieceApproConso.Items.Add(myreader.GetValue(0))
            End If
            a = myreader.GetValue(0)
nex:
        Loop

        myreader.Close()  'la ou je ferme mon sacré datareader ...
        connaccess.Close()
    End Sub

et pour remplir la seconde listbox:

Private Sub cbPieceApproConso_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbPieceApproConso.SelectedIndexChanged

        TABCONTROL.SelectTab(tcParPieces)
        tbNombreDePiece.Clear()
        tbNombreDeMetre.Clear()
        tbPUApproConso.Clear()
        tbFournisseurApproConso.Clear()

        Dim strConn, piece As String 'déclare la connection et la requete sous string

        cbLibelleApproConso.Items.Clear() 'vide la liste pour éviter d'ajout lors de selection

        strConn = "provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=./base pour GMAO.mdb;" 'met les carac dans la var string
        Dim connaccess As New OleDb.OleDbConnection(strConn) 'declare la connection la connection
        connaccess.Open() 'execute la connection

        piece = cbPieceApproConso.Text 'affecte la combobox piece à la var piece

        Dim macommande1 As OleDbCommand = connaccess.CreateCommand
        macommande1.CommandText = "SELECT Libellé FROM base_liste_pièces WHERE pièces='" & piece & "'"
        Dim myreader1 As OleDbDataReader = macommande1.ExecuteReader

        Do While myreader1.Read
            cbLibelleApproConso.Items.Add(macommande1.ExecuteReader(0)) 'là ou il me dit que le data est encore ouvert et qui ne doit pas l'être
       Loop

        myreader1.Close()
        connaccess.Close()
    End Sub

merci pour le temps que vous consacrerez pour que je puisse m'en sortir.
magicalement, a bientot?

http://les-baladins.org   Le site du spectacle.

2 réponses

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
33
Autant tu l'as bien fait dans la première fonction, autant tu le fais mal dans la seconde et tu ne vois pas le problème alors que les code sont quasiment identique.

.......
            Else
                cbPieceApproConso.Items.Add(myreader.GetValue(0))
            End If
.......
        Do While myreader1.Read
           
cbLibelleApproConso.Items.Add(myreader1.GetValue(0))
       Loop

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
37
Date d'inscription
lundi 7 juillet 2008
Statut
Membre
Dernière intervention
14 mars 2011

je vous remercie casy pour la précieuse aide que vous m'avez apportée. La prochaine fois, je ferais plus attention et pourtant je l'ai relu ce code plus d'une fois ....
merci encore et bonne continuation.

http://les-baladins.org   Le site du spectacle.