La table en question (se_visite_avec) fait une relation entre deux tables normales ("ouvrage" et "engin").
Voici la définition de se_visite_avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
CREATE TABLE [se_visite_avec] (
  [id_engin] int NOT NULL,
  [id_ouvrage] bigint NOT NULL,
  CONSTRAINT [pk_se_visite_avec] PRIMARY KEY ([id_ouvrage], [id_engin]),
  CONSTRAINT [se_visite_avec_fk] FOREIGN KEY ([id_engin]) REFERENCES [ENGIN] ([ID_engin]),
  CONSTRAINT [se_visite_avec_fk2] FOREIGN KEY ([id_ouvrage]) REFERENCES [ouvrage] ([ID_ouvrage])
)
Pour un ouvrage donné, l'utilisateur peut choisir dans une checkBoxList les engins qu'il y veut associer.

je remplis la checkListBox comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
Dim clé(1) As Object
Dim item As item
clé(0) = Me.identifiant
 
For Each ligne As DataRow In ds.Tables("engin").Rows
   item = New item(ligne.Item("nom_engin"), ligne.Item("id_engin"))
   clé(1) = ligne.Item("id_engin")
'ajoute l'item dans la chekListBox,
'checked=true si la table se_visite_avec a une ligne ID_ouvrage/Id_engin correspondante
   Me.clbMoyensVisite.Items.Add(item, ds.Tables("se visite avec").Rows.Contains(clé))
Next
Item est une classe que j'ai créée :
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
 
Public Class item
    Public Text As String = String.Empty
    Public Value As Object = Nothing
 
    Public Sub New(ByVal text As String, ByVal value As Object)
        Me.Text = text
        Me.Value = value
    End Sub
#End Region
 
    Public Overrides Function ToString() As String
        Return Me.Text
    End Function
End Class
Et la modification des données de ma table :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 Dim clé(1) As Object
        clé(0) = Me.identifiant
        For Each item As item In Me.clbMoyensVisite.Items
            Try
                clé(1) = item.Value
                If Me.clbMoyensVisite.CheckedItems.Contains(item) Then
                    If Not ds.Tables("se visite avec").Rows.Contains(clé) Then ds.Tables("se visite avec").Rows.Add(clé)
                Else
                    If ds.Tables("se visite avec").Rows.Contains(clé) Then ds.Tables("se visite avec").Rows.Remove(ds.Tables("se visite avec").Rows.Find(clé))
                End If
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        Next
J'espère que c'est à peu près clair...

Tout cela marchait, mais j'ai du passer tous mes dataAdapter de SqlClient à OleDb, ainsi que la connexion.
Et ça marche plus !!!
l'instruction a été arrêtée.
Conflit entre l'instruction INSERT et la contrainte COLUMN FOREIGN KEY 'se_visite_avec'.Le conflit est survenu dans la base de données 'gestion_oa', table 'ENGIN', column 'ID_engin'
Après investigations, il se trouve que la ligne inserée dans se_visite_avec a les deux clés inversées !

Pourquoi donc ?
Pourquoi ça marche avec la version SQLClient et pas OleDb ?
Que puis-je y faire ?