Bonjour,

Voici l'état actuel de mon projet d'utilisation de BD Access via VB.NEt :

Je dispose à présent de 3 tables Access :

  1. Manufacturing (N°,Manufacturing_Name)
  2. Rules (N°,Manufacturing_Name,Rule_Name)
  3. Features (N°,Rule_Name,Feature_Name)


avec les contraintes d'intégrité référentielles suivantes :
  1. 1 Manufacturing.Manufacturing_Name - Plusieurs Rules.Manufacturing_Name
  2. 1 Rules.Rule_Name - Plusieurs Features.Rule_Name


que je souhaite lier à 3 ListBox :

  1. ListManufacturing
  2. ListRules
  3. ListFeatures


Pour ListManufacturing, aucun problème, au chargement de la base, je parvient à la remplir.

Ensuite, à la sélection d'un item de ListManufacturing, je parviens à mettre à jour les items de ListRules avec le code suivant :

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
Private Sub ListManufacturing_SelectedValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListManufacturing.SelectedIndexChanged
 
        'le DataReader permet une lecture la plus rapide mais en lecture seul
        Me.ListRules.Items.Clear()
        'Me.ListRules.Text = "Select the Rule..."
        'Me.ListFeatures.Text = "Select the Feature..."
        Dim MyConnexion As OleDbConnection = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data source=H:\TX\[TX] IHM\Reverse_Engineering_Application.NET\Test.accdb")
        Dim MyCommand As OleDbCommand = MyConnexion.CreateCommand()
        MyCommand.CommandText = "SELECT Rules.Rule_Name FROM Rules WHERE Rules.Manufacturing_Name ='" & Me.ListManufacturing.SelectedItem & "';"
        MyConnexion.Open()
        'ajout des résultats de la requête dans ListRules
        Dim MyReader As OleDbDataReader = MyCommand.ExecuteReader()
        Do While MyReader.Read()
            Me.ListRules.Items.Add(MyReader.GetString(0))
        Loop
        'fermeture du monopole de lecture
        MyReader.Close()
        MyConnexion.Close()
        'fermeture dès la fin de la lecture
        'Dim myReader As OleDbDataReader = Mycommand.ExecuteReader(CommandBehavior.CloseConnection)
 
    End Sub
Le problème survient avec ListFeatures : j'ai tenté de la remplir en procédant comme ListRules :

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
Private Sub ListRules_SelectedValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListManufacturing.SelectedIndexChanged
 
        'le DataReader permet une lecture la plus rapide mais en lecture seul
        Me.ListFeatures.Items.Clear()
        'Me.ListFeatures.Text = "Select the Feature..."
        Dim MyConnexion As OleDbConnection = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data source=H:\TX\[TX] IHM\Reverse_Engineering_Application.NET\Test.accdb")
        Dim MyCommand As OleDbCommand = MyConnexion.CreateCommand()
        MyCommand.CommandText = "SELECT Features.Feature_Name FROM Features,Rules WHERE Features.Rule_Name = Rules.Rule_Name AND Rules.Manufacturing_Name ='" & Me.ListManufacturing.SelectedItem & "' AND Features.Rule_Name ='" & Me.ListRules.SelectedItem & "';"
        MyConnexion.Open()
        'ajout des résultats de la requête dans ListFeatures
        Dim MyReader As OleDbDataReader = MyCommand.ExecuteReader()
        Do While MyReader.Read()
            Me.ListFeatures.Items.Add(MyReader.GetString(0))
        Loop
        'fermeture du monopole de lecture
        MyReader.Close()
        MyConnexion.Close()
        'fermeture dès la fin de la lecture
        'Dim myReader As OleDbDataReader = Mycommand.ExecuteReader(CommandBehavior.CloseConnection)
 
    End Sub
mais rien n'y fait, je dois sélectionner à nouveau l'item sélectionné au tout début de ListManufacturing (la première ListBox) pour que le contenu de ListFeatures apparaisse.

-> Quelqu'un a une idée de la source du problème ?
(je soupçonne ma requête SQL ou peut-être qu'il s'agit de l'évènement déclencheur...)

-> Par ailleurs, est-il possible de ne pas avoir à me reconnecter à la base comme je le fais à chaque fois, c'est-à-dire de garder la connexion ?

Merci beaucoup et bonne journée à tous !