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 MVC Discussion :

Plantage lors de l'appel d'une procédure stockée


Sujet :

ASP.NET MVC

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut Plantage lors de l'appel d'une procédure stockée
    Bonjour.

    Voilà, je fais une appli en codefirst, et voici la première fois de ma vie que j'essaie d’appeler une procédure stockée. Ça ne pouvait que planter ^^.

    mon code c# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public static bool StoredProcedure_CheckUserName(string UserName)
            {
                bool IfExists = false;
     
                using (LivDevisContext db = new LivDevisContext())
                {
                    SqlParameter pUserName = new SqlParameter("@UserName", UserName);
                    IfExists = db.Database.SqlQuery<bool>("CheckUserName @UserName", pUserName).FirstOrDefault();
                }
     
                return IfExists;
            }
    ma procédure :
    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
    USE [LivDevis]
    GO
    /****** Object:  StoredProcedure [dbo].[CheckUserName]    Script Date: 26/12/2012 09:55:57 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:		<Author,,Name>
    -- Create date: <Create Date,,>
    -- Description:	<Description,,>
    -- =============================================
    ALTER PROCEDURE [dbo].[CheckUserName]
    	-- Add the parameters for the stored procedure here
    	@UserName nvarchar(30)
    AS
    BEGIN
    	DECLARE @NbUser BIT
     
        SELECT @NbUser = Count(*)
    	FROM [dbo].[User]
    	WHERE [dbo].[User].[UserName] = @UserName;
     
    	IF @NbUser = 1
    	BEGIN
    		RETURN 0
    	END
     
    	RETURN 1
    END
    mon erreur :
    Le lecteur de données possède plusieurs champs. Plusieurs champs ne sont pas valides pour des types primitifs ou des types énumération EDM.
    Qu'ai-je raté ? Merci

  2. #2
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    Apparememnt il y aurait plusieurs moyens pour faire un retour.

    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
    public static bool StoredProcedure_CheckUserName(string UserName)
            {
                bool IfExists = false;
     
                using (LivDevisContext db = new LivDevisContext())
                {
                    SqlParameter pUserName = new SqlParameter
                    {
                        ParameterName = "@UserName",
                        Value = UserName,
                        DbType = DbType.String,
                        Size = 30,
                        Direction = ParameterDirection.Input
                    };
     
                    SqlParameter pReturn = new SqlParameter
                    {
                        ParameterName = "@ReturnValue",
                        DbType = DbType.Boolean,
                        Direction = ParameterDirection.ReturnValue
                    };
     
                    db.Database.SqlQuery<bool>("CheckUserName @UserName", pUserName, pReturn).FirstOrDefault();
                }
     
                return IfExists;
            }

  3. #3
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    Solution finale et fonctionnelle :
    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
    private static bool StoredProcedure_CheckUserName(string UserName)
            {
                bool IfExists = false;
     
                using (LivDevisContext db = new LivDevisContext())
                {
                    db.Database.Connection.Open();
     
                    DbCommand cmd = db.Database.Connection.CreateCommand();
                    cmd.CommandText = "CheckUserName";
                    cmd.CommandType = CommandType.StoredProcedure;
     
                    cmd.Parameters.Add(new SqlParameter { ParameterName = "@UserName", Value = UserName, DbType = DbType.String, Size = 30, Direction = ParameterDirection.Input });
                    cmd.Parameters.Add(new SqlParameter { ParameterName = "@IfExists", Value = 0, DbType = DbType.Boolean, Direction = ParameterDirection.Output });
     
                    cmd.ExecuteReader();
     
                    int index = cmd.Parameters.IndexOf("@IfExists");
     
                    IfExists = (bool)cmd.Parameters[index].Value;
                }
     
                return IfExists;
            }
    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
    USE [LivDevis]
    GO
    /****** Object:  StoredProcedure [dbo].[CheckUserName]    Script Date: 27/12/2012 10:18:02 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:		<Author,,Name>
    -- Create date: <Create Date,,>
    -- Description:	<Description,,>
    -- =============================================
    ALTER PROCEDURE [dbo].[CheckUserName] (@UserName nvarchar(30), @IfExists bit OUTPUT)
    AS
    BEGIN
    	DECLARE @NbUser BIT
     
        SELECT @NbUser = Count(*)
    	FROM [dbo].[User]
    	WHERE [dbo].[User].[UserName] = @UserName;
     
    	SET @IfExists = 0
     
    	IF @NbUser = 1
    	BEGIN
    		SET @IfExists = 1
    	END
    END

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Pourquoi une proc stock pour quelque chose d'aussi simple ?

  5. #5
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    j'évite au maximum d'utiliser Entity Framework pour des opérations comme celle là. Dans le cas présent, lors d'une inscription d'un membre sur mon site, l'application doit vérifier la présence du UserName dans la base, et en générer un nouveau automatiquement s'il existe déjà. Utiliser une procédure stockée limite un peu les ressources utilisées, non ?

    Je peux me tromper, mais mon supérieur m'a demandé de les utiliser pour alléger les traitements.

    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
    public string CreateUserName()
            {
                string UserName = string.Empty;
                Regex str = new Regex("[^a-zA-Z]");
                string[] FirstNameExploded = str.Split(this.FirstName);
                foreach (string PartName in FirstNameExploded)
                {
                    if (!string.IsNullOrEmpty(PartName))
                    {
                        UserName = string.Concat(UserName, PartName[0]);
                    }
                }
                UserName = string.Concat(UserName, ".", this.LastName).ToLower();
     
                return LivDevis.ClassLibrary.Entities.User.CheckUserName(UserName);
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public static string CheckUserName(string UserName, int index = 0)
            {
                string UserName_TEMP = (index > 0) ? string.Concat(UserName, index) : UserName;
                bool IfExixts = StoredProcedure_CheckUserName(UserName_TEMP);
     
                if (IfExixts)
                {
                    index++;
                    UserName_TEMP = CheckUserName(UserName, index);
                }
     
                return UserName_TEMP;
            }
    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
    private static bool StoredProcedure_CheckUserName(string UserName)
            {
                bool IfExists = false;
     
                using (LivDevisContext db = new LivDevisContext())
                {
                    db.Database.Connection.Open();
     
                    DbCommand cmd = db.Database.Connection.CreateCommand();
                    cmd.CommandText = "CheckUserName";
                    cmd.CommandType = CommandType.StoredProcedure;
     
                    cmd.Parameters.Add(new SqlParameter { ParameterName = "@UserName", Value = UserName, DbType = DbType.String, Size = 30, Direction = ParameterDirection.Input });
                    cmd.Parameters.Add(new SqlParameter { ParameterName = "@IfExists", Value = 0, DbType = DbType.Boolean, Direction = ParameterDirection.Output });
     
                    cmd.ExecuteReader();
     
                    IfExists = (bool)cmd.Parameters[cmd.Parameters.IndexOf("@IfExists")].Value;
                }
     
                return IfExists;
            }

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Dans ce cas là autant déléguer à ta proc stock la récupération du prochain pseudo disponible parce que si ton pseudo est déjà pris jusqu'au 977 index tu vas appeler 978 fois ta proc stock (c'est de la que vient mon 978 dans le pseudo) et ça sera pas du tout performant.
    Sinon entre ce que fais ta proc stock actuellement et un exists avec entitiyframework je ne pense pas que tu vois la différence.

  7. #7
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    je vais y réfléchir. Je me remets doucement aux procédures stockées, j'espère que ce sera de mon niveau. Lorsque j'aurais fais quelque chose, je le posterais ici.

    Merci .

  8. #8
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    De rien et bonne chance pour la suite.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 05/06/2008, 14h37
  2. Erreur lors de l'appel d'une procédure stockée
    Par aperrin dans le forum JDBC
    Réponses: 1
    Dernier message: 04/01/2008, 13h54
  3. Problème lors de l'appel d'une procédure stockée
    Par ToxiZz dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 21/05/2006, 23h42
  4. Réponses: 2
    Dernier message: 10/12/2004, 15h43
  5. Appel d'une procédure stockée par un vbscript
    Par NicoNours dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/10/2004, 13h53

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