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

VB.NET Discussion :

Impossible d'ajouter une ligne à une table [Débutant]


Sujet :

VB.NET

  1. #1
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut Impossible d'ajouter une ligne à une table
    bonjour,

    Je me heurte depuis hier à un pb

    Pour ajouter une ligne à une table j'utilise le code-type suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Dim dr As DataRow = Nothing
    Dim dt As DataTable = MonDataSettypé.monDataTable
     
    dr=dt.NewRow
    dr("champ1")=valeur1
    dr("champ2")=valeur2
    ...
    dr("champN")=valeurN
     
    dt.Rows.Add(dr)
    MonTableAdapter.Update(dt)
    Dans cette table, champ0 est le compteur qui sert de clé primaire. Normalement, les instructions NeweRow suivie de Add doivent générer une valeur incrémentée stockée dans champ0.
    J'utilise déjà ce type de code pour ajouter des lignes à d'autres tables mais là, ça ne marche pas ; voici ce qui se passe à la place.

    Dabord, une ligne est bien ajoutée dans la table et est conforme.

    Mais, si plusieurs ligne de ma table contiennent la même valeur pour champ1, la première de ces lignes est modifiée avec les valeurs suivantes :
    champ1 = valeur1
    champ2=0
    champ 3 à N = <rien>

    Aucun message d'erreur.

    Je ne vois pas d'où ça peut provenir. Quelqu'un peut-il m'aiguiller ?

  2. #2
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    Salut

    Quelle requete as tu écris pour remplir monDataTable ?

  3. #3
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Quelques chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT champ0, champ1, ... , champ N FROM table

  4. #4
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    justement après avoir testé
    essaie plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT  champ1, ... , champ N FROM table
    tu n'as pas besoin de champ0 il est inseré automatiquement

  5. #5
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Pourtant quand je dis que ça marche avec d'autres tables, j'ai procédé de la même manière.
    D'ailleurs, si je tente de supprimer le champ0, j'ai le message d'erreur ci-joint qui montre que la méthode update et delete ne fonctionnera pas.
    Images attachées Images attachées  

  6. #6
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Petit complément : en fait j'avais un code qui fonctionnait bien, à base de SQL.
    Mon objectif est de simplifier mon code en utilisant les méthodes proposées par VB.NET à base de datatable.

    Voici mon code qui marchait :

    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
     
    Dim Connexion As New SQLiteConnection(My.Settings.ConnectionString)
    Dim SQL As String
    SQL = "INSERT INTO table (champ1, champ2, champ3, champ4, champ5, champ6) " & _
                         "VALUES (@champ1, @champ2, @champ3, @champ4, @champ5, @champ6)"
     
     Connexion.Open()
     Dim commande As New SQLiteCommand(SQL, Connexion)
                With commande.Parameters
                    .AddWithValue("@champ1", valeur1)
                    .AddWithValue("@champ2", valeur2)
                    .AddWithValue("@champ3", valeur3)
                    .AddWithValue("@champ4", valeur4)
                    .AddWithValue("@champ5", valeur5)
                    .AddWithValue("@champ6", valeur6)
                End With
                commande.ExecuteNonQuery()
                commande.Dispose()
    Ceci m'a fait penser que shayw avait peut-être raison, mais comme je l'ai indiqué, j'utilise déjà la méthode datarow.update pour d'autres tables structurées exactement de la même manière.

  7. #7
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    j'ai du me tromper il faut tous les champs
    et ainsi
    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
    Private ObjetDataAdapter As OleDbDataAdapter
        Private ObjetCommandBuilder As OleDbCommandBuilder
       private sub ajouter
         Dim dt As DataTable = MonDataSettypé.monDataTable
        Dim dr  As DataRow = dt.NewRow()
     
        therow("Nom") = "blabla"
        dr("champ1")=valeur1
        dr("champ2")=valeur2
    '...
        dr("champN")=valeurN
        dt.Rows.Add(therow)
     
            'Pour modifier les valeurs changées dans le DataAdapter
           ObjetCommandBuilder = New OleDbCommandBuilder(ObjetDataAdapter)
           'Mise à jour
           ObjetDataAdapter.Update(dt)
    end sub

  8. #8
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    C'est quoi therow et quel est son lien avec dr ?

  9. #9
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    il faut supprimer therow("Nom") = "blabla"

  10. #10
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    dans ce cas que devient la ligne dt.rows.add(therow)
    (si tu réponds qu'il faut remplacer therow par dr, ton code retombe sur le mien dans le premier post !)

    EDIT : et que fais-tu de ObjetCommandBuilder ?

  11. #11
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    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
    Private ObjetDataAdapter As OleDbDataAdapter
        Private ObjetCommandBuilder As OleDbCommandBuilder
        private sub ajouter
           Dim dt As DataTable = MonDataSettypé.monDataTable
           Dim dr  As DataRow = dt.NewRow()
     
          dr("champ1")=valeur1
        dr("champ2")=valeur2
    '...
        dr("champN")=valeurN
        dt.Rows.Add(dr)
        ObjetCommandBuilder = New OleDbCommandBuilder(ObjetDataAdapter)
        ObjetCommandBuilder.GetInsertCommand()
        ObjetDataAdapter.Update(dt)
    end sub

  12. #12
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Erreur sur la ligne 13 : "La propriété DataAdapter.SelectCommand doit être initialisée..."

    Je ne connais pas très bien les instructions CommandBuilder et GetInsertCommand, mais je crois comprendre que ton code consiste à définir un DataAdapter alors que j'en ai un à disposition, MonTableAdapter, construit par VisualStudio dans le schéma de table (onglet xsd) qui doit avoir toutes les caractéristiques requises (notamment celle d'accepter les méthodes Update, Insert et Delete).

    Donc je ne crois pas que la piste soit bonne.

  13. #13
    Membre éclairé
    Homme Profil pro
    Technicien bio médical
    Inscrit en
    Décembre 2012
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien bio médical
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2012
    Messages : 328
    Points : 768
    Points
    768
    Par défaut
    Bonsoir,
    L'avantage d'utiliser un dataset fortement typé c'est de pouvoir utiliser les objets créés par VS.
    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
     
    Public Sub Test()
            'On créé un objet qui a le format de la table Client en mémoire
            Dim dt As New EC_Dataset.ClientsDataTable
            'On créé l'objet DataAdapter correspondant à la table Client
            Dim da As New EC_DatasetTableAdapters.ClientsTableAdapter
            'On remplis la table en mémoire avec les données de la base de données
            da.Fill(dt)
            'On créé une nouvelle ligne en mémoire ayant le même schéma qu'une ligne dans ClientDataTable 
            Dim _NewClientRow As EC_Dataset.ClientsRow = dt.NewClientsRow()
            'On renseigne les champs avec de fausses données bien sûr
            With _NewClientRow
                .RaisonSociale = "DURAND Gilles"
                .Adresse = "51, Rue du pastis"
                .CodePostal = "30390"
                .Ville = "MARSEILLE"
            End With
            'On ajoute la ligne dans la table en mémoire
            dt.AddClientsRow(_NewClientRow)
            'On met à jour les données de la base de données avec les données de la table en mémoire
            da.Update(dt)
        End Sub
    J'ajouterais également qu'il vaut mieux tester la valeur .RowState avant d'ajouter la ligne dans la table en mémoire
    est ton amis, MSDN est ton maître, pour le reste il y a Developpez.net. Pensez au au et

  14. #14
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Merci Rainui,

    J'ai suivi tes conseils et ça marche.
    Cependant, cela me laisse perplexe car je ne vois pas très bien, fondamentalement, en quoi cette méthode diffère avec celle de mon premier post. Les objets sont certes différents mais devraient représenter la même chose il me semble.
    Si tu as une explication, je suis preneur.
    En attendant, cela me permet de passer le sujet en résolu.

    Nota : pour le rowstate, indirectement, c'est ce que je fais mais à l'origine. En effet, j'utilise le même code pour ajouter une ligne ou modifier une ligne existante. La vérification se fait donc en amont avec un flag qui me dit si je suis en mode ajout ou en mode modif et j'adapte les quelques instructions qui changent en fonction de ce flag.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 27/02/2021, 16h57
  2. [WD14] Thread qui ajoute des lignes à une table
    Par rndhnqz dans le forum WinDev
    Réponses: 11
    Dernier message: 09/02/2010, 12h48
  3. Ajouter dynamiquement une ligne à une table ET form
    Par etathome dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/09/2008, 16h33
  4. ajouter supprimer une ligne dans table
    Par mans27 dans le forum JSF
    Réponses: 1
    Dernier message: 28/05/2007, 13h56
  5. [DOM] Ajout dynamique d'une ligne dans un <table>
    Par Alzelus dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 23/05/2007, 17h05

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