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 :

valider la suppression d'une ligne dans une base de donnée


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 30
    Points : 15
    Points
    15
    Par défaut valider la suppression d'une ligne dans une base de donnée
    Bonjour,
    Je suis débutant en programmation a tel point que je ne suis pas sûr d'être dans la bonne section du forum.
    Je travail pour l'instant sous Visual Basic 2008 Express en attendant La version Studio Pro.
    Je me suis engagé dans la création d'un logiciel pour mon boulot et je suis bloqué régulièrement. J'arrive souvent par tatonnement à m'en sortir, mais là je bloque depuis 5 jours. Les topics relatifs à mon problème ne m'ont pas aidé.
    Mon Problème :
    J'ai une base de donnée qui m'affiche une liste d'activité sportive.
    J'arrive a ajouter des activités et à sauvegarder ces dernières avec ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            Me.Validate()
            Me.ListeApsaBindingSource.EndEdit()
            Me.TableAdapterManager1.UpdateAll(Me.ListeApsaDataSet)
    Par contre lorsque je supprime une ligne et que je veux sauvegarder j'ai cette erreur :
    Update requiert un DeleteCommand valide lors du passage de la collection DataRow avec des lignes supprimées.
    Je n'arrive pas a trouver la ligne de code pour effectuer cet Update. Je vois ce que me demande le proramme mais n'arrive pas à trouver la solution.

    Derrière mon bouton suppression j'ai ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Me.ListeClasseBindingSource.RemoveCurrent()
    Merci pour vos pistes.
    Il est dur d'être auto didacte. AU passage si vous connaissez un ouvrage intéressant je suis preneur car les ouvrages type "débuter en programmation" me laisse sur ma faim.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Dans le designer de ton DataSet, il faut que tu définisses un DeleteCommand pour le TableAdapter qui correspond à la table. Un truc du genre "DELETE FROM ... WHERE...". Normalement c'est fait automatiquement si tu coches l'option qui va bien... Tu utilises quoi comme base de données ?

    Citation Envoyé par elrenzo Voir le message
    Il est dur d'être auto didacte.
    C'est sur que si tu démarres sans aucun support, livre ou tuto tu vas galérer...

    Citation Envoyé par elrenzo Voir le message
    AU passage si vous connaissez un ouvrage intéressant je suis preneur car les ouvrages type "débuter en programmation" me laisse sur ma faim.
    Il y a des tutos ici :
    http://dotnet.developpez.com/cours/?page=vbnet
    Et des critiques de livres là :
    http://dotnet.developpez.com/livres/

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Merci pour la piste, cela a fonctionné ou presque.
    Maintenant j'ai une nouvelle erreur qui apparait!
    Je vais tenter de la résoudre en cherchant..., c'est le meilleur moyen d'apprendre.
    Pour les ouvrages, je ne sais pas par quoi commencer car le monde de la programmation est vaste.
    Pour les tuto en ligne, c'est bien, mais le support papier est plus pratique a mon gout.
    Merci pour l'aide!

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Sinon il y a la doc MSDN qui contient des tonnes d'infos (installe la en local, c'est plus pratique et plus rapide)
    Personnellement j'ai débuté comme ça, sans accès internet ni bouquin...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Evolution...
    Je n'ai toujours aucun problème pour ajouter des lignes et les sauvegarder, mais une nouvelle erreur me bloque à nouveau lorsque je veux supprimer une ligne.
    J'ai cet indicateur :
    ExecuteNonQuery : la propriété CommandText n'a pas été initialisée
    Lié à cette ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.TableAdapterManager1.UpdateAll(Me.ListeApsaDataSet)
    Lorsque je modifie le TableAdapter au niveau de ExecuteMode de "Reader" en "NonQuery" j'ai ce message d'erreur :
    Arguments trop nombreux pour 'Public Overridable Overloads Function Fill() As Integer'.
    Sur le web ou sur msdn je n'ai pas trouvé de béquille suffisante. alors je me tourne a nouveau vers vous pour progresser.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    tu as quoi comme DeleteCommand dans ton TableAdapter ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    J'ai repris dans le détail mon Delete Commande et je n'arrive pas a trouver la bonne syntaxe.
    Actuellement je suis revenu à la syntaxe primaire :
    Bien évidemment, cela supprime toute les entrée lors de la sauvegarde n'ayant pas donné de condition à mon Delete.

    Je travaille dans une Form avec une ComboBox. J'arrive a supprimer les items un par un lorsque j'utilise le programme.

    Je pensais mettre ce code, mais il n'est pas reconnu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FORM ListeApsa WHERE ListeApsa = " "
    Mais ce code n'est pas reconnu.

    Quelle est la commande qui permet de cibler les éléments que l'on supprime item par item en utilisant un bouton Suppression avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
     
            Me.ListeClasseBindingSource.RemoveCurrent()
     
        End Sub
    Merci de l'aide que vous m'apportez. Même si je n'avance pas concretement, je comprends de plus en plus de chose. avec l'aide apportée.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Il faut mettre une condition par rapport à la clé primaire de la table (disons Id pour l'exemple), quelque chose du genre :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FORM ListeApsa WHERE Id = 1234
    Sauf que la même requête doit pouvoir être utilisée pour toutes les lignes, il ne faut donc pas mettre en dur la valeur de Id, mais utiliser un paramètre. La syntaxe varie selon le type de base de données, mais le plus souvent on écrit ça comme ça :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FORM ListeApsa WHERE Id = @Id
    Dans la DeleteCommand, il faut ajouter un paramètre "@Id", auquel le TableAdapter affectera une valeur lors de l'exécution. Il faut renseigner les propriétés suivantes du paramètre :
    ParameterName = "@Id"
    DbType = le type de donnée du paramètre (le même type que la colonne de clé primaire dans ce cas)
    SourceColumn = le nom de la colonne correspondante dans le DataSet

    Quand tu vas exécuter la méthode Update du TableAdapter, il va exécuter la DeleteCommand pour chaque ligne supprimée dans le DataSet, en définissant comme valeur du paramètre la valeur de la colonne indiquée dans SourceColumn. Idem pour les UpdateCommand (pour les lignes modifiées) et InsertCommand (pour les lignes ajoutées)

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Je me trompe certainement au niveau de la clé primaire, mais ma table ne comportant qu'une colonne, j'ai fait "l'erreur" de nommer tout à l'identique : Ma table s'appelle ListeApsa, ma colonne ListeApsa.

    J'ai créer comme conseillé
    un paramètre au nom de "@ListeApsa"
    DbType = J'hésite entre String et AinsiString car je ne maîtrise pas très bien cette notion de Clé Primaire. Mes colonnes comportant uniquement des caractères, j'ai spécifié par contre le Provider type comme nText c'est à dire identique au critère de ma colonne de table.
    SourceColumn = ListeApsa
    J'ai rentré la ligne de code suivante dans le CommandTEXT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE FROM ListeApsa
    WHERE     (ListeApsa = [@ListeApsa])
    J'arrive toujours à implémenter ma colonne et à sauvegarder mais lorsque je supprime une ligne lors de l'exécution du prog, j'ai cette erreur à la sauvegarde :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Syntaxe incorrecte vers 'ntext'.
    Associée à cette ligne de code rentrée manuellement et liée à un Bouton dans mon Form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Me.TableAdapterManager1.UpdateAll(Me.ListeApsaDataSet)
    Travaillant sur Visual Basic Express, je passe par des modules guides pour programmer. Faut il que je rentre dans le codage brut pour chercher mon erreur?
    Voici ce dernier relatif à mes problèmes :
    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
     Me._adapter.TableMappings.Add(tableMapping)
                Me._adapter.DeleteCommand = New Global.System.Data.SqlClient.SqlCommand
                Me._adapter.DeleteCommand.Connection = Me.Connection
                Me._adapter.DeleteCommand.CommandText = "DELETE FROM [ListeApsa] WHERE ListeApsa = (@ListeApsa)"
                Me._adapter.DeleteCommand.CommandType = Global.System.Data.CommandType.Text
                Me._adapter.DeleteCommand.Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@ListeApsa", Global.System.Data.SqlDbType.NText, 0, Global.System.Data.ParameterDirection.Input, 0, 0, "ListeApsa", Global.System.Data.DataRowVersion.Current, False, Nothing, "", "", ""))
                Me._adapter.InsertCommand = New Global.System.Data.SqlClient.SqlCommand
                Me._adapter.InsertCommand.Connection = Me.Connection
                Me._adapter.InsertCommand.CommandText = "INSERT INTO [dbo].[ListeApsa] ([ListeApsa]) VALUES (@ListeApsa)"
                Me._adapter.InsertCommand.CommandType = Global.System.Data.CommandType.Text
                Me._adapter.InsertCommand.Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@ListeApsa", Global.System.Data.SqlDbType.NText, 0, Global.System.Data.ParameterDirection.Input, 0, 0, "ListeApsa", Global.System.Data.DataRowVersion.Current, false, Nothing, "", "", ""))
                Me._adapter.UpdateCommand = New Global.System.Data.SqlClient.SqlCommand
                Me._adapter.UpdateCommand.Connection = Me.Connection
                Me._adapter.UpdateCommand.CommandText = ""
                Me._adapter.UpdateCommand.CommandType = Global.System.Data.CommandType.Text

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par elrenzo Voir le message
    Je me trompe certainement au niveau de la clé primaire, mais ma table ne comportant qu'une colonne, j'ai fait "l'erreur" de nommer tout à l'identique : Ma table s'appelle ListeApsa, ma colonne ListeApsa.
    C'est pas grave normalement

    Citation Envoyé par elrenzo Voir le message
    DbType = J'hésite entre String et AinsiString car je ne maîtrise pas très bien cette notion de Clé Primaire.
    Sans grande importance je crois, String ira très bien
    Et pas de rapport avec le fait que ce soit une clé primaire

    Citation Envoyé par elrenzo Voir le message
    Mes colonnes comportant uniquement des caractères, j'ai spécifié par contre le Provider type comme nText c'est à dire identique au critère de ma colonne de table.
    J'ai pas compris ce que tu voulais dire...

    Citation Envoyé par elrenzo Voir le message
    J'ai rentré la ligne de code suivante dans le CommandTEXT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE FROM ListeApsa
    WHERE     (ListeApsa = [@ListeApsa])
    Essaie sans les "[ ]"

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Erreur "nouvelle" et toujours liée à mon update
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Les types de données ntext et ntext sont incompatibles dans l'opérateur equal to

    Comme affiché dans mon précédent message, la fonction update n'est pas renseignée dans le code de ma table, elle l'est uniquement liée à mon bouton dans mon form.
    L'erreur n'est pas à ce niveau?
    Voici le code du Form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
     
            Me.Validate()
            Me.ListeApsaBindingSource.EndEdit()
            Me.TableAdapterManager1.UpdateAll(Me.ListeApsaDataSet)
     
        End Sub
    Et le code de ma table est vide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Me._adapter.UpdateCommand = New Global.System.Data.SqlClient.SqlCommand
                Me._adapter.UpdateCommand.Connection = Me.Connection
                Me._adapter.UpdateCommand.CommandText = ""
                Me._adapter.UpdateCommand.CommandType = Global.System.Data.CommandType.Text
    Faut il mettre un commandText du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE ListeApsa SET ListeApsa = @ListeApsa

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par elrenzo Voir le message
    Erreur "nouvelle" et toujours liée à mon update
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Les types de données ntext et ntext sont incompatibles dans l'opérateur equal to
    Il faut pas utiliser le type NTEXT, c'est obsolète et ça va disparaitre dans une prochaine version de SQL Server. En plus, tu peux pas comparer 2 valeurs, si bien que tu n'as plus aucun moyen d'identifier une ligne de ta table puisque c'est la seule colonne...
    Il vaut mieux utiliser le type NVARCHAR à la place

    Citation Envoyé par elrenzo Voir le message
    Et le code de ma table est vide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Me._adapter.UpdateCommand = New Global.System.Data.SqlClient.SqlCommand
                Me._adapter.UpdateCommand.Connection = Me.Connection
                Me._adapter.UpdateCommand.CommandText = ""
                Me._adapter.UpdateCommand.CommandType = Global.System.Data.CommandType.Text
    Il sort d'où ce code ? C'est du code généré par le designer du DataSet ? Dans ce cas il faut pas le modifier, tes modifs seraient écrasées par le designer... il faut renseigner les commandes directement dans le designer.

    Citation Envoyé par elrenzo Voir le message
    Faut il mettre un commandText du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE ListeApsa SET ListeApsa = @ListeApsa
    Oui, mais avec un WHERE ce serait mieux
    Le problème c'est que dans ton cas la colonne que tu modifies est la même que celle qui sert à identifier la ligne... donc il y a une astuce :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE ListeApsa SET ListeApsa = @ListeApsa WHERE ListeApsa = @OldListeApsa
    Et tu définis le paramètre @OldListApsa de la même façon que @ListApsa, avec juste une différence : pour la propriété SourceVersion, il faut mettre Original (pour indiquer que tu veux prendre la valeur originale du champ, telle qu'elle était avant la modification). Pour @ListeApsa il faut mettre Current, mais pas besoin de le faire explicitement, c'est le cas par défaut.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Merci pour la réponse, mais il y a maintenant un conflit entre NText et NVarchar, je n'arrive pas à trouver à quel niveau du code il reste un NText.
    Je poursuis mes recherches.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    ENFIN! Merci pour l'aide précieuse! J'ai tout repris à zéro, j'ai même réussi à aller plus loin dans mon projet en cherchant...pendant 5 jours. Mais j'ai réussi!
    Par contre j'ai un autre problème maintenant. J'ai donc ouvert un autre post.
    Merci encore pour l'aide!

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 21/10/2009, 13h31
  2. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  3. [E-00] Syntaxe pour insérer une ligne ou une colonne dans une feuille
    Par Benjycool dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/02/2009, 09h27
  4. [MySQL] inserer une ligne d'une table dans une autre table
    Par piero53 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 14/12/2008, 18h29
  5. Réponses: 3
    Dernier message: 29/01/2008, 12h08

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