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 :

Récupérer le compteur d'une nouvelle ligne de DataTable


Sujet :

VB.NET

  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut Récupérer le compteur d'une nouvelle ligne de DataTable
    Bonjour,

    En manipulant une DataTable, je crée une nouvelle ligne dans celle-ci.
    Il se trouve que la clé primaire est un compteur (champ0)

    Donc je fais :
    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")=...
    dr("champ2")=...
    ...
    dr("champN")=...
     
    dt.Rows.Add(dr)
    MonTableAdapter.Update(dt)
    A ce stade, j'ai besoin de récupérer le champ0 sur la ligne de dr qui a été généré.
    Mais l'instruction dr("champ0") me renvoie -1 même si je l'intercale avant la méthode Add, juste après, ou juste après la méthode Update.

    Comment faire ?

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Je pense que cette ligne devrait faire suffire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    compteur = dr.items("champ0").value
    ou si tu est sur que ton champ0 est bien en colonne 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    compteur = dr.items(0).value
    P.S. Je n'ai pas accès à mes programmes, ni à mon aide, VB pour l'instant, mais je pense que tu peux te passer de cette ligne :

    Il me semble qu'en ajoutant une ligne à la table, la collection Rows se met ;a jour automatiquement.

  3. #3
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    Citation Envoyé par clementmarcotte Voir le message
    Bonjour,

    Je pense que cette ligne devrait faire suffire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    compteur = dr.items("champ0").value
    Ben c'est ce que j'ai fait avant de poster ma question (cf mon premier message) mais ça me renvoie -1

  4. #4
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    Avec une instruction Linq,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (From element In MonDataSettypé.monDataTable Select element.Champ0)(MonDataSettypé.monDataTable.Rows.Count - 1)
    j'ai pu identifier que si mon compteur est à la valeur 180 (par exemple) avant ajout d'un enregistrement, la valeur suivante est -1 alors que, dans le même temps, la visualisation de ma table dans SQLExpert montre bien que le Nème enregistrement porte bien le n°181

  5. #5
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    P.S. Je n'ai pas accès à mes programmes, ni à mon aide, VB pour l'instant, mais je pense que tu peux te passer de cette ligne :


    Il me semble qu'en ajoutant une ligne à la table, la collection Rows se met ;a jour automatiquement.
    J'ai fait un test et il n'est pas concluant. Si je ne mets pas l'instruction dt.Rows.Add(dr), le compteur le nouvel enregistrement n'est pas ajouté à la table.

  6. #6
    Membre émérite

    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
    Par défaut
    Salut
    essaie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim c As Object
            c = dt.Rows(dt.Rows.Count - 1).Item("champs0")

  7. #7
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    c=-1
    Ce qui est assez logique compte tenu des tests précédents.

  8. #8
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    J'ai trouvé une parade, mais je ne la trouve pas très élégante.
    Elle consiste à re-remplir ma datatable :

    Je vous laisse le soin d'en juger et de commenter si vous avez mieux ou plus joli (j'ai mis l'instruction en gras par rapport à mon premier message) :

    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
     
    Dim dr As DataRow = Nothing
    Dim dt As DataTable = MonDataSettypé.monDataTable
     
    dr=dt.NewRow
    dr("champ1")=...
    dr("champ2")=...
    ...
    dr("champN")=...
     
    dt.Rows.Add(dr)
    MonTableAdapter.Update(dt)
    
    MonTableAdapter.Fill(MonDataSettypé.monDataTable)
    
    Tag = dt.Rows(dt.Rows.Count - 1).Item("champ0")
    Bizarre que l'instruction Update n'inclue pas l'effet de l'action Fill

  9. #9
    Membre émérite

    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
    Par défaut
    En faite je n'ai pas bien lu

    et si tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim c As Object
            c = dt.Rows(dt.Rows.Count - 2).Item("champs0") +1
    un peu risqué

  10. #10
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    Je vois ton idée mais je préfère encore ma parade.
    Comme tu dis elle est très risquée. Même si je compacte la base avant chaque ajout d'enregistrement (voir ce topic), je n'ai pas fait de tests très poussé et ne suis pas certain qu'il n'y a pas un chemin de code permettant à l'utilisateur de passer outre et donc de générer un saut de compteur entre son nouvel enregistrement et le précédent.

    Ma parade n'est pas très orthodoxe mais au moins elle ne comporte pas de risque

  11. #11
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par noftal Voir le message
    J'ai trouvé une parade, mais je ne la trouve pas très élégante.
    Elle consiste à re-remplir ma datatable :

    Je vous laisse le soin d'en juger et de commenter si vous avez mieux ou plus joli (j'ai mis l'instruction en gras par rapport à mon premier message) :

    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
     
    Dim dr As DataRow = Nothing
    Dim dt As DataTable = MonDataSettypé.monDataTable
     
    dr=dt.NewRow
    dr("champ1")=...
    dr("champ2")=...
    ...
    dr("champN")=...
     
    dt.Rows.Add(dr)
    MonTableAdapter.Update(dt)
    
    MonTableAdapter.Fill(MonDataSettypé.monDataTable)
    
    Tag = dt.Rows(dt.Rows.Count - 1).Item("champ0")
    Bizarre que l'instruction Update n'inclue pas l'effet de l'action Fill
    essaie avec cela:


    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 dr As DataRow = Nothing
    Dim dt As DataTable = MonDataSettypé.monDataTable
     
    dr=dt.Rows.Add()
    dr("champ1")=...
    dr("champ2")=...
    ...
    dr("champN")=...
     Tag = dr.Item("champ0")
    
    MonTableAdapter.Update(dt)
    
    MonTableAdapter.Fill(MonDataSettypé.monDataTable)
    Là tu ajouterais ta ligne et tu mettrais ta collection à jour en même temps. Tu n'aurais pas à "remonter" d'une ligne pour récupérer ta valeur.

  12. #12
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    Je ne sais pas si c'est beaucoup plus optimal dans l'esprit.
    Mais surtout : la syntaxe de la ligne 5 est erronée. La méthode Add prend un Row en paramètre, nécessairement

  13. #13
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    Bonsoir,

    Il existe une instruction SQL pour récupérer l'ID auto-incrémenté : @@Identity : http://www.mikesdotnetting.com/Artic...y-added-record

    Pour pouvoir utiliser le dataadapter.update sans bricoler, l'astuce consiste à faire une procédure stockée pour insèrer la ligne, cette procédure aura un paramètre ID qui sera retourné via l'instruction SQL ci-dessus : http://msdn.microsoft.com/fr-fr/library/bb469808.aspx

  14. #14
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour noftal

    tu peux avoir ton Rows.Count à jour dans l'event Row_Changed du DataTable moyennant l'ajout du Handler approprie....

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            OrdersTableAdapter1.Fill(MyOrdersDataSet1.Orders)
            DataGridView1.DataSource = MyOrdersDataSet1.Orders
     
            AddHandler MyOrdersDataSet1.Orders.RowChanged, New  _
                     DataRowChangeEventHandler(AddressOf Row_Changed)
     
     
     
        End Sub
     
      Private Sub btnAddRow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAddRow.Click
            AddRow()
        End Sub
        Private Sub AddRow()
     
            Dim dt As DataTable = MyOrdersDataSet1.Orders
     
            ' Add Order.
            Dim row As DataRow = dt.NewRow()
            row("FirstName") = "Name" + numID.ToString()
            dt.Rows.Add(row)
     
            OrdersTableAdapter1.Update(dt)
     
     
        End Sub
    Private Sub Row_Changed(ByVal sender As Object, ByVal e As DataRowChangeEventArgs)
            Dim objDT As DataTable = CType(sender, DataTable)
     
            Me.TextBox1.Text = Me.TextBox1.Text + e.Row.RowState.ToString() + Environment.NewLine
     
       'ce Rows.Count tient compte de l'ajout
     
          Me.TextBox1.Text = Me.TextBox1.Text + objDT.Rows.Count.ToString() + Environment.NewLine
     
        End Sub
    l'event Row_Changed gere egalement la modification de Row...

    Il existe egalement un autre event "faux ami" DataTable.TableNewRow
    mais il donne un RowCount avant l'ajout .Gare !!!!
    bon code....

Discussions similaires

  1. Réponses: 7
    Dernier message: 11/06/2007, 20h39
  2. [C# .NET2.0][MySQL] Insertion d'une nouvelle ligne via un dataset
    Par bodygard dans le forum Accès aux données
    Réponses: 1
    Dernier message: 16/05/2007, 12h22
  3. Réponses: 2
    Dernier message: 06/02/2007, 09h17
  4. Réponses: 18
    Dernier message: 26/07/2006, 14h51
  5. Réponses: 2
    Dernier message: 07/12/2005, 16h26

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