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 :

Modification sans toucher la clé


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 257
    Par défaut Modification sans toucher la clé
    Comment je peux modifier certains champs d'un enregistrement et ne pas modifier d'autres. Par exemple : J'ai une table "Fournisseur" et je veux modifier certains champs de cette table d'un enregistrement sauf que je ne veux pas modifier la clé de cette table car elle doit être intouchable. Comment faire?

    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
     
    Private Sub Btnvalider_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btnvalider.Click
            Dim cnx As New OleDbConnection
            Dim cmd = New OleDbCommand("update Fournisseur set Fournisseur.Nom_frs='" & Txtnomfrs.Text & "'" & ", Fournisseur.Adr_frs='" & Txtadr.Text & "'" & ", Fournisseur.Tel_frs='" & Txttel.Text & "'" & ", Fournisseur.Fax_frs='" & Txtfax.Text & "'" & ", Fournisseur.Email_frs='" & Txtemail.Text & "'" & " where Num_frs='" & Txtnumfrs.Text & "'", cnx)
            Try
                cnx.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Documents and Settings\Administrateur.STANDARD\Mes documents\Projet Budget\Budget\Budget\Marches.mdb"
                cnx.Open()
                cmd.connection = cnx
                cmd.executenonquery()
                MsgBox("Le fournisseur a été modifié avec succès", MsgBoxStyle.Information + MsgBoxStyle.OkOnly)
            Catch ex As Exception
                MsgBox(ex.Message)
            Finally
                If Not (cnx Is Nothing) Then
                    cnx.Close()
                End If
            End Try
            Frmprincipale.Show()
            Me.Close()
        End Sub

  2. #2
    Membre Expert Avatar de LaChips
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 109
    Par défaut
    Bonjour,
    Je ne comprend pas ce que tu veux dire par modifier la clef : est ce que tu parles de la clef primaire? qui dans ce cas à l'air d'être le numéro de fournisseur et dans ta requête tu ne la modifies pas donc je ne vois pas l'utilité de ta question.

    Si tu veux qu'elle ne soit pas modifiable par une requête, applique des droits sur ta table fournisseurs et la colonne numéro de fournisseur

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 374
    Par défaut
    Bonjour,
    Pour créer la requête utilise un string.format(l'encodage est plus simple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim SCMD as string
    scmd = string.format("update Fournisseur set Fournisseur.Nom_frs='{0}', {1}','{2}','{3}','{4}' where Num_frs = '{5}' ",
    Txtnomfrs.Text , Txtadr.Text, Txttel.Text, Txtfax.Text , Txtemail.Text Txtnumfrs.Text).
    Pour répondre à ta question, il faut placer dans la requête uniquement les champs à modifier.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    scmd = string.format("update Fournisseur set Fournisseur.Nom_frs='{0}' where Num_frs = '{1}' ",
    Txtnomfrs.Text, Txtnumfrs.Text).
    va modifier le champ Fournisseur.Nom ayant la clé Txtnumfrs.text.
    La clé de l'enregistrement ne peut pas être modifiée sauf par delete/insert.
    J'espère que cela répond à ta question.
    Bon boulot Jean

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 257
    Par défaut
    J'ai essayé comme tu l'a dis mais là il ne prend même pas en considération les modifications effectuées. Voici ce que j'ai fait :
    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
     
    Private Sub Btnvalider_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btnvalider.Click
            Dim cnx As New OleDbConnection
            Dim SCMD As String
            SCMD = String.Format("update Fournisseur set Fournisseur.Nom_frs=' ', Fournisseur.Adr_frs='', Fournisseur.Tel_frs='', Fournisseur.Fax_frs='', Fournisseur.Email_frs='' where Num_frs=''", Txtnomfrs.Text, Txtadr.Text, Txttel.Text, Txtfax.Text, Txtemail.Text)
            Try
                cnx.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Documents and Settings\Administrateur.STANDARD\Mes documents\Projet Budget\Budget\Budget\Marches.mdb"
                cnx.Open()
                MsgBox("Le fournisseur a été modifié avec succès", MsgBoxStyle.Information + MsgBoxStyle.OkOnly)
            Catch ex As Exception
                MsgBox(ex.Message)
            Finally
                If Not (cnx Is Nothing) Then
                    cnx.Close()
                End If
            End Try
            Frmprincipale.Show()
            Me.Close()
        End Sub

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    tu as retiré ton objet command et tu ne l'executes pas ta requete
    c'est donc un fonctionnement normal ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 257
    Par défaut
    J'ai essayé ceci mais il me sort ce msg d'erreur "Type de données incompatibles dans l'expression de critère"
    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
     
     Private Sub Btnvalider_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btnvalider.Click
            Dim cnx As New OleDbConnection
            Dim SCMD As String
            Dim cmd As New OleDbCommand
            SCMD = String.Format("update Fournisseur set Fournisseur.Nom_frs=' ', Fournisseur.Adr_frs='', Fournisseur.Tel_frs='', Fournisseur.Fax_frs='', Fournisseur.Email_frs='' where Num_frs=''", Txtnomfrs.Text, Txtadr.Text, Txttel.Text, Txtfax.Text, Txtemail.Text)
            cmd.CommandText = SCMD.ToString
            Try
                cnx.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Documents and Settings\Administrateur.STANDARD\Mes documents\Projet Budget\Budget\Budget\Marches.mdb"
                cnx.Open()
                cmd.Connection = cnx
                cmd.ExecuteNonQuery()
                MsgBox("Le fournisseur a été modifié avec succès", MsgBoxStyle.Information + MsgBoxStyle.OkOnly)
            Catch ex As Exception
                MsgBox(ex.Message)
            Finally
                If Not (cnx Is Nothing) Then
                    cnx.Close()
                End If
            End Try
            Frmprincipale.Show()
            Me.Close()
        End Sub

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    ton String.Format ne ressemble pas à celui qu'on t'a proposé
    il y avait des {1} ..
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 257
    Par défaut
    J'ai tjrs le même msg d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     SCMD = String.Format("update Fournisseur set Fournisseur.Nom_frs='{0} ', Fournisseur.Adr_frs='{1}', Fournisseur.Tel_frs='{2}', Fournisseur.Fax_frs='{3}', Fournisseur.Email_frs='{4}' where Num_frs='{5}'", Txtnomfrs.Text, Txtadr.Text, Txttel.Text, Txtfax.Text, Txtemail.Text, Cbxnomfrs.Text)

  9. #9
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    revient sans le string.format alors ...
    j'en vois pas trop l'utilité

    de tout facon c'est des SqlParameters qu'il faut utiliser
    car si un utilisateur met un apostrophe dans le nom d'un fournisseur ta requete va planter si tu passes par un string
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 257
    Par défaut
    Je ne comprend pas ce que tu veux dire par "revient sans le string.format alors ...". Si je l'enlève il y aura une erreur de syntaxe

  11. #11
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    au debut tu utilisais
    Dim cmd = New OleDbCommand("update Fournisseur set Fournisseur.Nom_frs='" & Txtnomfrs.Text & "'" & ", Fournisseur.Adr_frs='" & Txtadr.Text & "'" & ", Fournisseur.Tel_frs='" & Txttel.Text & "'" & ", Fournisseur.Fax_frs='" & Txtfax.Text & "'" & ", Fournisseur.Email_frs='" & Txtemail.Text & "'" & " where Num_frs='" & Txtnumfrs.Text & "'", cnx)

    sans utiliser de string.format
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 257
    Par défaut
    JPelli m'as conseillé de faire ça en plus je ne sais pas comment je peux modifier un enregistrement sans modifier la clé primaire.

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 374
    Par défaut
    Bonjour,
    Pour moi l'utilisation d'un string.format simplifie la construction de la requête mais ta façon est tout aussi valable(avant c'est ce que je faisais).
    Avant d'exécuter la requête, récupère le texte de la commande SQL et teste là dans un éditeur SQL car en effet s'il y a des ' dans le texte il faut les doubler.(avec un .replace("'","''")).
    La clé primaire sert à trouver un enregistrement afin de le modifier avec un update.(ou de le supprimer).
    Dans ta requête je suppose que la clé primaire est le champ Num_frs et tu peux faire la mise à jour(update) des autres champs de l'enregistrement.
    Bon boulot Jean

  14. #14
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    Citation Envoyé par loverdev Voir le message
    JPelli m'as conseillé de faire ça en plus je ne sais pas comment je peux modifier un enregistrement sans modifier la clé primaire.


    faut arreter de fumer !

    si tu ne fais pas "SET champ_cle_primaire = .." alors il ne sera pas modifié (regarde l'aide de ton sgdb (sql server ou autre))
    utilises un sqlcommand (regarde l'aide de vs ou trouve un tuto sur l'accès aux données)
    et si possible des sqlparameters
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  15. #15
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 257
    Par défaut
    En faisant comme dab voici le msg d'erreur qui apparaît "La champ 'Num_frs' n'est pas un champ pouvant être mis à jour".
    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
     
     Private Sub Btnvalider_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btnvalider.Click
            Dim cnx As New OleDbConnection
            Dim cmd As New OleDbCommand
            cmd.CommandText = ("update Fournisseur set Fournisseur.Num_frs='" & Txtnumfrs.Text & "'" & ", Fournisseur.Nom_frs='" & Txtnomfrs.Text & "'" & ", Fournisseur.Adr_frs='" & Txtadr.Text & "'" & ", Fournisseur.Tel_frs='" & Txttel.Text & "'" & ", Fournisseur.Fax_frs='" & Txtfax.Text & "'" & ", Fournisseur.Email_frs='" & Txtemail.Text & "'" & " where Nom_frs='" & Cbxnomfrs.Text & "'")
            Try
                cnx.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Documents and Settings\Administrateur.STANDARD\Mes documents\Projet Budget\Budget\Budget\Marches.mdb"
                cnx.Open()
                cmd.Connection = cnx
                cmd.ExecuteNonQuery()
                MsgBox("Le fournisseur a été modifié avec succès", MsgBoxStyle.Information + MsgBoxStyle.OkOnly)
            Catch ex As Exception
                MsgBox(ex.Message)
            Finally
                If Not (cnx Is Nothing) Then
                    cnx.Close()
                End If
            End Try
            Frmprincipale.Show()
            Me.Close()
        End Sub

  16. #16
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    puisque tu es réfractaire à la touche F1 je vais te le mettre ici

    syntaxe de la commande update

    UPDATE nom_table SET champ=nouvelle_valeur
    WHERE condition


    champ=nouvelle_valeur, à mettre pour tous les champs qu'on veut modifier

    or tu ne veux pas modifier la clé primaire

    ALORS POURQUOI TU LA METS DANS LA REQUETE ????

    set Fournisseur.Num_frs='" & Txtnumfrs.Text

    j'en suis à la limite de penser que tu trolles le forum depuis 2 mois ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  17. #17
    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
    Par défaut
    Citation Envoyé par JPelli Voir le message
    Bonjour,
    Pour moi l'utilisation d'un string.format simplifie la construction de la requête mais ta façon est tout aussi valable(avant c'est ce que je faisais).
    En fait, tu voulais sûrement dire que ces deux méthodes sont aussi mauvaises l'une que l'autre
    Comme l'a dit Sperot, la bonne méthode est d'utiliser des DbParameter.
    Citation Envoyé par JPelli Voir le message
    Avant d'exécuter la requête, récupère le texte de la commande SQL et teste là dans un éditeur SQL car en effet s'il y a des ' dans le texte il faut les doubler.(avec un .replace("'","''")).
    Cette méthode est un réliquat des langages peu évolués datant du siècle dernier (PHP avant la version 5 par exemple). Je te conseille de te renseigner sur les paramètres SQL, ici par exemple.
    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

  18. #18
    Membre expérimenté Avatar de fred777888999
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 250
    Par défaut
    Cbxnomfrs.Text
    Les combos ont une ppte text accessibles en vb ? Remarque j'y connais rien en vb, mais en c#, ce serai Cbxnomfrs.SelectedItem.Text...

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

Discussions similaires

  1. Crypter transit des données sans toucher au code source
    Par thecrafty dans le forum Protocoles
    Réponses: 2
    Dernier message: 08/06/2007, 17h31
  2. Supprimer une classe Fille sans toucher a la Mere
    Par 17mounir dans le forum Hibernate
    Réponses: 2
    Dernier message: 08/01/2007, 12h27
  3. Réponses: 4
    Dernier message: 25/04/2006, 19h41
  4. [J2ME][MIDlet]rafraichir une image sans toucher au form?
    Par noobiewan kenobi dans le forum Java ME
    Réponses: 1
    Dernier message: 05/09/2005, 09h54
  5. Onglet version : modif sans recompiler
    Par Jerome0075 dans le forum Windows
    Réponses: 3
    Dernier message: 29/07/2004, 10h12

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