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

Accès aux données Discussion :

Problème commande INSERT INTO


Sujet :

Accès aux données

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2009
    Messages : 3
    Par défaut Problème commande INSERT INTO
    Bonjour à tous,

    Je suis nouveau sur ce site et je débute en ASP.NET (avec Visual Web Developer 2008 Express Edition).
    Je dois créer un site avec enregistrement d'utilisateurs. Pour ce faire, j'utilise un contrôle CreateUserWizard que j'ai personnalisé. Jusque là, aucun problème. Ensuite j'ai créé une table "UserProfiles" dans la base de données ASPNETDB.MDF qui contient des informations complémentaires. La clé primaire est UserId et est liée au UserId de la table "aspnet_Users". J'ai rajouté un SqlDataSource pour lequel j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <asp:SqlDataSource ID="SqlDataSource1" runat="server"
       ConnectionString="<%$ ConnectionStrings:ASPNETDBConnectionString %>"
       InsertCommand="INSERT INTO UserProfiles(UserId, Identifiant) VALUES (@UserId, @Identifiant)">
    </asp:SqlDataSource>
    J'ai ensuite surchargé la méthode CreatedUser afin d'insérer dans ma table "UserProfiles" les nouveaux champs. Pour l'exemple ici je me suis limité à un seul champ ("Identifiant" nchar(9))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        protected void CreateUserWizard1_CreatedUser(object sender, EventArgs e)
        {
            MembershipUser user = Membership.GetUser(CreateUserWizard1.UserName);
            Object id = user.ProviderUserKey;
     
            Random r = new Random();
            string Identifiant = r.Next(100000000, 1000000000).ToString();
     
            SqlDataSource DataSource = (SqlDataSource)CreateUserWizardStep1.ContentTemplateContainer.FindControl("SQLdataSource1");
            DataSource.InsertParameters.Add("UserId", id.ToString());
            DataSource.InsertParameters.Add("Identifiant", Identifiant);
            DataSource.Insert();
        }
    Tout fonctionne très bien... Toutefois et même si les chances sont infimes, je veux être sûr que l'identifiant n'existe pas déjà. Comment dois-je faire ??

    Merci,

  2. #2
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    Citation Envoyé par _ljdm_ Voir le message
    Tout fonctionne très bien... Toutefois et même si les chances sont infimes, je veux être sûr que l'identifiant n'existe pas déjà. Comment dois-je faire ??
    Tu peux faire un select avant...sinon, si c'est un identifiant que tu veux generer, tu peux stocker en base le dernier identifiant, et appeler une proc stock qui te lockes la table, recupere la donnee, et l'incremente, et te la renvoies...

    ...ou si tu veux etre sur, autant utiliser un guid

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2009
    Messages : 3
    Par défaut
    Citation Envoyé par Philippe Vialatte Voir le message
    Tu peux faire un select avant...sinon, si c'est un identifiant que tu veux generer, tu peux stocker en base le dernier identifiant, et appeler une proc stock qui te lockes la table, recupere la donnee, et l'incremente, et te la renvoies...

    ...ou si tu veux etre sur, autant utiliser un guid
    Merci pour votre réponse rapide. Le guid ne va pas pour mon application. J'avais déjà pensé faire un SELECT avec le nouvel Identifiant et voir si la commande me renvoyait une table vide. Si oui, j'exécute la commande INSERT, si non je regénère un nouvel Identifiant et je refais le test. Le problème...je ne sais pas comment coder cela dans la méthode CreatedUser !? Je suis débutant...

    Mille mercis quand-même

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2009
    Messages : 3
    Par défaut
    La solution était plus simple...mais je débute. J'ai ajouté un index sur la colonne "Identification" (est unique = oui). La commande INSERT génère alors une exception si la valeur existe déjà. D'où le code suivant (pas encore optimisé) :
    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
     
    protected void CreateUserWizard1_CreatedUser(object sender, EventArgs e)
        {
            MembershipUser user = Membership.GetUser(CreateUserWizard1.UserName);
            Object id = user.ProviderUserKey;
     
            Random r = new Random();
            string Identifiant = r.Next(100000000, 1000000000).ToString();
     
            SqlDataSource DataSource = (SqlDataSource)CreateUserWizardStep1.ContentTemplateContainer.FindControl("SQLdataSource1");
            DataSource.InsertParameters.Add("UserId", id.ToString());
            DataSource.InsertParameters.Add("Identifiant", Identifiant);
            while (true)
            {
                try
                {
                    DataSource.Insert();
                    break;
                }
                catch (Exception ex)
                {
                    Identifiant = r.Next(100000000, 1000000000).ToString();
                    DataSource.InsertParameters["Identifiant"].DefaultValue = Identifiant;
                }
            }
        }

  5. #5
    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
    ???
    pourquoi ne pas utiliser la propriété identity de la colonne Identifiant? en gros, tu laisse SQL Server générer lui-même un ID, tu es sûr qu'il y a pas de doublon et surtout pas d'exception

Discussions similaires

  1. syntaxe commande INSERT INTO
    Par hottnikks_79 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/11/2006, 13h52
  2. la commande insert into et le type serial
    Par nael_n dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 28/08/2006, 11h16
  3. Problème ADO - INSERT INTO
    Par unionriton dans le forum Bases de données
    Réponses: 12
    Dernier message: 14/12/2005, 14h36
  4. Réponses: 12
    Dernier message: 25/11/2005, 12h29
  5. Réponses: 3
    Dernier message: 10/05/2005, 11h02

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