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 :

Champ de table renseigné par code


Sujet :

VB.NET

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Points : 265
    Points
    265
    Par défaut Champ de table renseigné par code
    Bonjour,
    sous VS2008, j'ai créé une bdd sql server avec une table Joueurs ayant comme clé primaire un champ de type UniqueIdentifier.
    Sur mon formulaire FicheJoueur, j'ai créé l'interface en déposant mon dataset créé précédemment.
    J'ai donc sur ma form FicheJoueur un label représentant le Joueur ID. Je veux renseigner ce champ par code avec un System.Guid.NewGuid(). J'ai donc placé ce code dans l'évènement AddNewItem du BindingNavigator en faisant :
    lblJoueurID.Text = System.Guid.NewGuid().ToString
    Mais rien n'apparait dans le label. Et donc, quand je clique sur le bouton pour sauvegarder les données que je viens d'entrer, j'ai une erreur "Le champ Joueur_Id n'accepte pas de valeurs nulles", forcément.
    Comment renseigner ce champ par code ?

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Points : 265
    Points
    265
    Par défaut Auto-réponse
    Bon, alors je me réponds à moi-même...
    Après moults tatonnements, j'ai défini par code la propriété DefaultValue de ma colonne Joueur_ID à System.Guid.NewGuid(), dans la procédure AddNewItem (j'avais essayé auparavant dans le Load de ma form ainsi que dans la procédure SaveItem mais ça ne marchait pas) et... ça marche !

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Points : 265
    Points
    265
    Par défaut Nouveaux problèmes...
    Bon, une chose de résolue mais voici mes nouveaux problèmes :
    dans ma form FicheJoueur, lorsque j'ajoute plusieurs joueurs à la suite et qu'après je clique sur le bouton Save du BindingNavigator, une exception est levée : "Violation of PRIMARY KEY constraint 'PK_Joueurs'. Cannot insert duplicate key in 'dbo.Joueurs'".
    Autrement dit, il m'indique que 2 enregistrements possèdent une colonne 'Joueur_ID' (qui est ma clé primaire) identique. Pourtant, à chaque ajout, le Joueur_ID change bien (un nouveau Guid est généré).
    En outre, juste avant la synchronisation du dataset avec la bdd, j'ai fait un test et le DataSet ne contient aucune erreur. (DataSet.HasErrors=False).
    C'est l'appel de la méthode UpdateAll du TableAdapterManager qui provoque l'erreur.
    Si par contre j'ajoute un joueur, que je sauvegarde, que j'ajoute un autre joueur, que je sauvegarde...etc là, ça marche impec.
    Comment cela se fait-il ?

    2e problème : lorsque j'ai enregistré plusieurs joueurs, que je ferme l'application, et que je la relance, ils ne sont pas triés par ordre alphabétique. La commande Select de mon dataAdapter fait appel à une procédure stockée qui contient "ORDER BY Joueur_Nom". De plus, la propriété Text de la commande Select de mon DataAdatper est définie sur "Joueurs_SELECT ORDER BY Joueur_Nom" (Joueurs_SELECT étant le nom de la procédure stockée). Et bien rien n'y fait, le tri ne marche pas !
    Voici le code de ma form :
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    Public Class FicheJoueur
        Private maCommandeUpdate As New SqlClient.SqlCommand
        Private maCommandeInsert As New SqlClient.SqlCommand
        Private maCommandeDelete As New SqlClient.SqlCommand
        Private maCommandeSelect As New SqlClient.SqlCommand
     
        Private Sub FicheJoueur_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            With maCommandeUpdate
                .CommandType = CommandType.StoredProcedure
                .CommandText = "Joueurs_UPDATE"
                .Parameters.Add("@Joueur_Id", SqlDbType.VarChar, 50)
                .Parameters.Add("@Joueur_Nom", SqlDbType.VarChar, 50)
                .Parameters.Add("@Joueur_Prenom", SqlDbType.VarChar, 50)
                .Parameters.Add("@Joueur_Date", SqlDbType.DateTime)
                .Parameters.Add("@Joueur_Classement", SqlDbType.VarChar)
                .Parameters.Add("@Joueur_Notes", SqlDbType.VarChar, 255)
            End With
            '
            With maCommandeInsert
                .CommandType = CommandType.StoredProcedure
                .CommandText = "Joueurs_INSERT"
                .Parameters.Add("@Joueur_Id", SqlDbType.VarChar, 50)
                .Parameters.Add("@Joueur_Nom", SqlDbType.VarChar, 50)
                .Parameters.Add("@Joueur_Prenom", SqlDbType.VarChar, 50)
                .Parameters.Add("@Joueur_Date", SqlDbType.DateTime)
                .Parameters.Add("@Joueur_Classement", SqlDbType.VarChar)
                .Parameters.Add("@Joueur_Notes", SqlDbType.VarChar, 255)
            End With
            '
            With maCommandeDelete
                .CommandType = CommandType.StoredProcedure
                .CommandText = "Joueurs_DELETE"
                .Parameters.Add("@Joueur_Id", SqlDbType.VarChar, 50)
            End With
            '
            With maCommandeSelect
                .CommandType = CommandType.StoredProcedure
                .CommandText = "Joueurs_SELECT ORDER BY Joueur_Nom"
            End With
            Me.JoueursTableAdapter.Adapter.SelectCommand = maCommandeSelect
            Me.JoueursTableAdapter.Adapter.InsertCommand = maCommandeInsert
            Me.JoueursTableAdapter.Adapter.UpdateCommand = maCommandeUpdate
            Me.JoueursTableAdapter.Adapter.DeleteCommand = maCommandeDelete
            '
            'TODO: This line of code loads data into the 'DstTennisPerfs.Joueurs' table. You can move, or remove it, as needed.
            Me.JoueursTableAdapter.Fill(Me.DstTennisPerfs.Joueurs)
        End Sub
     
        Private Sub JoueursBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles JoueursBindingNavigatorSaveItem.Click
            '
            'On attribue aux paramètres des requêtes SQL leurs valeurs
            maCommandeInsert.Parameters("@Joueur_Id").Value = lblJoueurID.Text
            maCommandeInsert.Parameters("@Joueur_Nom").Value = txtNom.Text
            maCommandeInsert.Parameters("@Joueur_Prenom").Value = txtPrenom.Text
            maCommandeInsert.Parameters("@Joueur_Notes").Value = txtNotes.Text
            maCommandeInsert.Parameters("@Joueur_Classement").Value = txtClassement.Text
            maCommandeInsert.Parameters("@Joueur_Date").Value = CDate(dtpDateNaissance.Value)
            '
            maCommandeDelete.Parameters("@Joueur_Id").Value = lblJoueurID.Text
            '
            maCommandeUpdate.Parameters("@Joueur_Id").Value = lblJoueurID.Text
            maCommandeUpdate.Parameters("@Joueur_Nom").Value = txtNom.Text
            maCommandeUpdate.Parameters("@Joueur_Prenom").Value = txtPrenom.Text
            maCommandeUpdate.Parameters("@Joueur_Notes").Value = txtNotes.Text
            maCommandeUpdate.Parameters("@Joueur_Classement").Value = txtClassement.Text
            maCommandeUpdate.Parameters("@Joueur_Date").Value = CDate(dtpDateNaissance.Value)
            '
            Try
                Me.Validate()
                Me.JoueursBindingSource.EndEdit()
                Me.TableAdapterManager.UpdateAll(Me.DstTennisPerfs)
            Catch ex As Exception
                MsgBox(ex.ToString, MsgBoxStyle.OkOnly)
            End Try
     
        End Sub
     
        Private Sub BindingNavigatorAddNewItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorAddNewItem.Click
     
            Dim monID As System.Guid = System.Guid.NewGuid()
            Me.DstTennisPerfs.Tables("Joueurs").Columns("Joueur_ID").DefaultValue = monID.ToString
            Me.txtNom.Focus()
        End Sub
     
    End Class

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Points : 265
    Points
    265
    Par défaut Source de l'erreur
    Je viens de trouver la cause de l'erreur de mon 1er problème, sans toutefois être parvenu pour l'instant à la corriger.
    Je viens de me rendre compte que lorsque j'ajoute à la suite plusieurs joueurs et que j'appuie sur le bouton de sauvagarde, le Guid pris en compte pour TOUS les joueurs est le dernier affiché ! (et seulement lui)
    Pourquoi ? Mystère... je continue de creuser
    Si quelqu'un a une idée entre-temps....

  5. #5
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Bah, c'est normal, tu ne fais qu'affecter la valeur par défaut dans le addnew. Cette valeur sera la même pour tous les éléments ajoutés...
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Points : 265
    Points
    265
    Par défaut
    OK, mais alors je reviens à ma question initiale (cf 1er message) : comment affecter par code un nouveau Guid pour chaque joueur ajouté ? Je m'arrache les cheveux...

  7. #7
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Il y a un événement AddingNew sur le binding source, ça devrait t'être utile.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Points : 265
    Points
    265
    Par défaut
    OK pour l'évènement AddingNew mais... quoi mettre dedans ?
    Si je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private Sub JoueursBindingSource_AddingNew(ByVal sender As Object, ByVal e As System.ComponentModel.AddingNewEventArgs) Handles JoueursBindingSource.AddingNew
     
            lblJoueurID.Text = System.Guid.NewGuid().ToString
     
    End Sub
    Je me retrouve avec le lblJoueurID vide (cf 1er message) et donc le message d'erreur "La colonne Joueur_ID n'accepte pas les valeurs nulles".
    Je tourne en rond...

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Points : 265
    Points
    265
    Par défaut
    Je désespère de trouver une réponse à mon problème...
    Toute la documentation que j'ai pu trouvée ne mentionne pas ce cas : à chaque fois, la clé primaire est un champ numéro auto géré par la bdd.
    Je n'ai trouvé nulle part d'infos pour générer soi-même ce champ (ça, pas de problème) et surtout pour l'affecter à la colonne correspondante : quel code mettre et dans quel évènement ?...
    Si quelqu'un a des infos...

  10. #10
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Il y a un exemple dans la MSDN pour l'événément AddingNew. Tu n'as qu'à regarder...
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Points : 265
    Points
    265
    Par défaut
    Je viens de jeter un oeil. J'ai créé, comme dans l'exemple, une classe Joueur, puis dans l'évènement AddingNew, j'ai donné à e.NewObject la valeur New Joueur ; cette fois, à l'ajout d'un nouvel enregistrement, il me sort l'erreur :
    "Les objets ajoutés à la liste d'un BindingSource doivent tous être du même type". Je craque...
    Je ne pensais pas me torturer autant les neurones sur un problème d'apparence aussi anodin...

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Points : 265
    Points
    265
    Par défaut
    J'abandonne...
    ...pour l'instant !
    Devant l'inextricabilité de mon problème, j'ai changé le champ Joueur_ID en champ numérique auto-incrémenté par la bdd.
    Je me pencherai + tard sur le problème de la personnalisation d'un nouvel enregistrement...
    Merci à SaumonAgile de s'être penché sur le problème.

Discussions similaires

  1. Erreur au niveau de la mise à jour d'une table Oracle par code VB
    Par lilas_violet dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 15/07/2010, 12h26
  2. [AC-2000] renseignement par un champ d'un formulaire dans une table
    Par guaguanco dans le forum IHM
    Réponses: 2
    Dernier message: 18/06/2010, 06h26
  3. Crée une Table Acces Par Code VBA
    Par faressam dans le forum VBA Access
    Réponses: 3
    Dernier message: 18/03/2008, 10h19
  4. Champ de table - Valeur par défaut
    Par Lingo dans le forum Access
    Réponses: 1
    Dernier message: 26/10/2006, 15h59
  5. aditionner les champs d'une table ligne par ligne
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/08/2005, 08h38

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