Précédent   Forum du club des développeurs et IT Pro > Dotnet > Développement Web avec .NET > ASP.NET MVC
ASP.NET MVC Forum d'entraide sur le développement de site web avec le framework ASP.NET MVC.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 26/12/2012, 10h17   #1
thor76160
Membre habitué
 
Inscription : décembre 2007
Messages : 683
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2007
Messages : 683
Points : 146
Points : 146
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 :
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 :
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 :
Citation:
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
thor76160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 10h51   #2
thor76160
Membre habitué
 
Inscription : décembre 2007
Messages : 683
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2007
Messages : 683
Points : 146
Points : 146
Apparememnt il y aurait plusieurs moyens pour faire un retour.

Code :
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;
        }
thor76160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 10h18   #3
thor76160
Membre habitué
 
Inscription : décembre 2007
Messages : 683
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2007
Messages : 683
Points : 146
Points : 146
Solution finale et fonctionnelle :
Code :
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 :
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
thor76160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 10h40   #4
youtpout978
Membre Expert
 
Homme John Doe
Développeur .NET
Inscription : novembre 2010
Messages : 911
Détails du profil
Informations personnelles :
Nom : Homme John Doe
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : novembre 2010
Messages : 911
Points : 1 457
Points : 1 457
Pourquoi une proc stock pour quelque chose d'aussi simple ?
youtpout978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 11h08   #5
thor76160
Membre habitué
 
Inscription : décembre 2007
Messages : 683
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2007
Messages : 683
Points : 146
Points : 146
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 :
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 :
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 :
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;
        }
thor76160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 14h31   #6
youtpout978
Membre Expert
 
Homme John Doe
Développeur .NET
Inscription : novembre 2010
Messages : 911
Détails du profil
Informations personnelles :
Nom : Homme John Doe
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : novembre 2010
Messages : 911
Points : 1 457
Points : 1 457
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.
youtpout978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 16h11   #7
thor76160
Membre habitué
 
Inscription : décembre 2007
Messages : 683
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2007
Messages : 683
Points : 146
Points : 146
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 .
thor76160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 16h32   #8
youtpout978
Membre Expert
 
Homme John Doe
Développeur .NET
Inscription : novembre 2010
Messages : 911
Détails du profil
Informations personnelles :
Nom : Homme John Doe
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : novembre 2010
Messages : 911
Points : 1 457
Points : 1 457
De rien et bonne chance pour la suite.
youtpout978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 05h50.


 
 
 
 
Partenaires

Hébergement Web