[VB.NET]insert dans une table à clé primaire sur 2 colonnes
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:
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:
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:
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:
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 !!!
Citation:
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 ?