IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[VB.NET]insert dans une table à clé primaire sur 2 colonnes


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 78
    Points : 51
    Points
    51
    Par défaut [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 : 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 ?

  2. #2
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    donne nous le Insert CommandText de ton OleDbAdapter pour voir
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  3. #3
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 78
    Points : 51
    Points
    51
    Par défaut
    Je les ai pas sous la main, mais ça ne vient pas de là, avant de faire l'Update de mon dataAdapter, les données sont déjà inversées dans la table.
    Le problème vient je pense du fait que la clé porte sur deux colonnes...

  4. #4
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    c'est quoi ton sgbd goony :
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  5. #5
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 78
    Points : 51
    Points
    51
    Par défaut
    Pour l'insatnt, c'est SQL server, d'où le SqlClient, mais la boîte va peut-être changer d'ici peu, c'est pour ça que je dois changer en OleDb...
    Mais je le répète, le problème est avant la mise à jour !

  6. #6
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 78
    Points : 51
    Points
    51
    Par défaut
    j'ai trouvé !
    En fait, le soucis est on ne peu plus simple...
    La raison pour laquelle ça marchait avant et pas après avoir refait mes dataAdapter, c'est que les ordres select des dataAdapter n'étaient pas les même...
    Avant, c'était :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select id_ouvrage, id_engin from se_visite_avec
    et après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select id_engin, id_ouvrage from se_visite_avec
    Tout cela est maintenant rentré dans l'ordre...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/12/2008, 16h24
  2. Réponses: 3
    Dernier message: 24/04/2006, 21h03
  3. [Sybase] Temps d'une insertion dans une table
    Par vsavoir dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 14/02/2005, 10h04
  4. Extraction d'un .txt et Insertion dans une table
    Par PoPmiSiR dans le forum Access
    Réponses: 8
    Dernier message: 28/10/2004, 19h13
  5. Détection insertion dans une Table
    Par abelman dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/07/2004, 14h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo