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
Pour un ouvrage donné, l'utilisateur peut choisir dans une checkBoxList les engins qu'il y veut associer.
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]) )
je remplis la checkListBox comme ceci :
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 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
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
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
J'espère que c'est à peu près clair...
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
Tout cela marchait, mais j'ai du passer tous mes dataAdapter de SqlClient à OleDb, ainsi que la connexion.
Et ça marche plus !!!
Après investigations, il se trouve que la ligne inserée dans se_visite_avec a les deux clés inversées !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'
Pourquoi donc ?
Pourquoi ça marche avec la version SQLClient et pas OleDb ?
Que puis-je y faire ?
Partager