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

ASP.NET Discussion :

Verifier si un enregistement existe


Sujet :

ASP.NET

  1. #1
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut Verifier si un enregistement existe
    Bonjour,

    J'ai une base de données sous SqlServer contenant une table, cette dernière comporte 3 colonnes.

    A partir d'un formulaire web, je cherche à insérer un enregistrement dans cette table si ce dernier n'existe pas (Contrainte UNIQUE). S'il existe, je veux afficher le message correspondant.

    Merci d'avance pour votre aide !

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 10
    Par défaut
    salut,

    Si tu utilise une DataTable, tu peux utiliser la methode DataRow.find(), qui recherchera l'index avec la cle primaire

    http://msdn.microsoft.com/fr-fr/libr...yk(VS.80).aspx

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	if(MaTable.Rows.Find(ValuerDeClePrimaire) != null)
    	{
    		System.Windows.Forms.MessageBox.Show("La ligne existe déja");
    	} else {
    		// inserer la ligne
    	}

    Sinon avec une SqlDataSource, tu peux utiliser l'evènement OnInserted (déclenché apres une insertion) et vérifier qu'une exception n'est pas levée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    protected void MaSource_Inserted(Object sender, SqlDataSourceStatusEventArgs e)
    {
    	if(e.ExceptionHandled)
    	{
    		string Msg = "Erreur d'insertion : " + e.Exception.GetBaseException().Message; // attention à éviter de donner des infos sensibles à l'utilisateur
    		System.Windows.Forms.MessageBox(Msg);
    	}
    }

    http://msdn.microsoft.com/fr-fr/libr...ed(VS.80).aspx

  3. #3
    Membre éprouvé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Par défaut
    Sinon si tu es bon en sql tu peux egalement ecrire la condition en sql du style Not Exists (select ....), c'est parfois meme mieux car on ne connait pas trop le fonctionnement de ce qui se cache derrière les outils asp.

  4. #4
    Membre éclairé Avatar de flogreg
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 432
    Par défaut
    avec une procédure stockée, tu peux testé si l'enregistrement existe et si il n'existe pas, tu fais l'insertion. Tu peux demander à ce que la procdure te renvoit un boolean pour savoir si l'enregistrement a été inséré ou non

  5. #5
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    Citation Envoyé par flogreg Voir le message
    avec une procédure stockée, tu peux testé si l'enregistrement existe et si il n'existe pas, tu fais l'insertion. Tu peux demander à ce que la procdure te renvoit un boolean pour savoir si l'enregistrement a été inséré ou non
    Oui, cette solution m'interesse. Alors comment créer cette procédure ?

    Merci à tous...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 32
    Par défaut
    Je pense que le plus simple est d'insérer dans la table. La contrainte UNIQUE provoquera un message d'erreur si la valeur est déjà présente.

    Exemple

    Côté SQL avec une table ma_table(ma_colonne CHAR(3) UNIQUE)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE PROCEDURE I_ma_table
    	@Valeur VARCHAR(3)
    AS
    	INSERT ma_table(ma_colonne) VALUES (@Valeur)
    GO
    Côté ASP.NET/C#. On exécute la procédure stockée et on gère le cas ou on a un code retour 2627 (violation de contrainte UNIQUE)

    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
    using (SqlConnection Connexion = new SqlConnection("CHAINE_CONNEXION"))
    {
    	using(SqlCommand Commande = new SqlCommand("I_ma_table", Connexion))
    	{
    		Commande.CommandType = CommandType.StoredProcedure;
     
    		Commande.Parameters.Add(new SqlParameter("@valeur", SqlDbType.Char,3));
    		Commande.Parameters["@valeur"].Value = "XXX";
     
    		Commande.Parameters.Add(new SqlParameter("RETURN_VALUE", SqlDbType.Int));
    		Commande.Parameters["RETURN_VALUE"].Direction=ParameterDirection.ReturnValue;
     
    		Connexion.Open();
     
    		try
    		{
    			Commande.ExecuteNonQuery();
    		}
    		catch(SqlException ExceptionInsertion)
    		{
                if (Commande.Parameters["RETURN_VALUE"].Value!=null)
                {
    			    if ((Int32)Commande.Parameters["RETURN_VALUE"].Value==2627)
    			    {
                        //GESTION ERREUR
    			    }
    			    else 
    			    {
    				    throw (ExceptionInsertion);
    			    }
                }
    		}
    	}
    }
    J'ai juste un petit doute sur les performances car il me semble avoir lu qu'il fallait éviter les try...catch. Mais après tout, il s'agit d'exceptions
    ________________________________
    Seminoque, créateur de
    http://www.bingokaz.com

  7. #7
    Membre éclairé Avatar de flogreg
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 432
    Par défaut
    tu peux aussi tester dans ta procédure stockée que l'enregistrement existe ou pas avec un select. Si il n'existe pas, tu l'insert. Avec la méthode ci-dessus, il n'y a aucun intéret à utiliser la procédure stockée. Enfin, il me semble.

  8. #8
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Par défaut
    Citation Envoyé par flogreg Voir le message
    tu peux aussi tester dans ta procédure stockée que l'enregistrement existe ou pas avec un select. Si il n'existe pas, tu l'insert. Avec la méthode ci-dessus, il n'y a aucun intéret à utiliser la procédure stockée. Enfin, il me semble.
    erreur!!! TOUJOURS utiliser des SP pour l'insertion, ne serait-ce que pour vérifier les paramètres et limiter le SQL injection. il faut utiliser des SP dès qu'on en a la possibilité.

  9. #9
    Membre éclairé Avatar de flogreg
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 432
    Par défaut
    en fait, je me suis mal fait comprendre

    Quand je disais que ca n'apportait rien de plus, je parlais de son exemple. Cad essayer de faire un insert et si ca ne marche pas, récupérer l'erreur. Que ce soit en requete direct ou en procédure stockées, la méthode ne me semble pas judicieuse. Ce que je voulais faire comprendre, c'était de faire un test dans la procédure stockée pour tester si l'enregistrement existe et sinon l'ajouter.

    Bien sur, je recommande d'utiliser au maximum les procédures stockées surtout quand plusieurs tables sont impactées, ce qui permet de gérer facilement les transactions. Mais c'est un autre débat

  10. #10
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    Comment implémenter cette procédure stockée.

    1- Vérifier que l'enregsitrement existe ?
    2- Si Oui, on génère un message dans lequel figure "l'enregistrement existe déjà".
    3- Si Non, on l'insert.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 32
    Par défaut
    Bon ben voilà une version avec le test d'existence. si le code de retour vaut -1, l'enregistrement existe déjà, s'il vaut 0 il a été inséré et si c'est une autre valeur ... Pour le code C# c'est quasimment le même que celui de mon message précédent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE PROCEDURE I_ma_table
    	@Valeur VARCHAR(3)
    AS
    	IF NOT EXISTS(SELECT 1 FROM ma_table WHERE ma_colonne=@Valeur)
    	BEGIN
    		INSERT ma_table(ma_colonne) VALUES (@Valeur)
    		RETURN 0
    	END
    	ELSE
    	BEGIN
    		RETURN -1
    	END
    GO
    ________________________________
    Seminoque, créateur de
    http://www.bingokaz.com

Discussions similaires

  1. [XSLT]verifier si un noeud existe deja
    Par davelo dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 22/03/2006, 16h47
  2. verifier si un fichier existe
    Par franfr57 dans le forum ASP
    Réponses: 7
    Dernier message: 12/02/2006, 10h08
  3. Verifier qu'un champ existe en vba
    Par dynxd dans le forum Access
    Réponses: 4
    Dernier message: 02/10/2005, 17h10
  4. Réponses: 2
    Dernier message: 05/09/2005, 16h32
  5. Verifier qu'un dossier existe (batch)
    Par kakou dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 08/01/2003, 13h46

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