nn99
Messages postés1Date d'inscriptiondimanche 30 décembre 2007StatutMembreDernière intervention15 mai 2011
-
15 mai 2011 à 17:32
PapyNormand
Messages postés27Date d'inscriptionsamedi 7 août 2010StatutMembreDernière intervention16 janvier 2014
-
16 mai 2011 à 20:39
bonjour,
je suis débutante en c#,j'ai écris un script afin de pouvoir me connecter avec un login et mot de passe à une base de donnée sql:
using System;
using System.Data;
using System.Data.SqlClient;
public partial class Authentification : System.Web.UI.Page
{
public bool AuthenticateUser(string username, string password)
{
bool authenticated;
SqlDataReader reader;
SqlConnection conn = new SqlConnection(Globals.ConnectionString());
SqlCommand cmd = new SqlCommand("AuthenticateUser",conn);
if (auth)
{
// authenticated was successful, lets create the authentication cookie and redirect them to another place (either where they were trying to go to or default.aspx)
FormsAuthentication.RedirectFromLoginPage(txtuser.Text, false);
}
else
{
Console.Write( "Account information was incorrect. Please try again!");
PapyNormand
Messages postés27Date d'inscriptionsamedi 7 août 2010StatutMembreDernière intervention16 janvier 20141 16 mai 2011 à 20:39
Bonjour,
Vous avez le code suivant
SqlCommand cmd = new SqlCommand("AuthenticateUser",conn);
cette forme du constructeur pour une SqlCommand me semble renseignée de façon incorrecte . En effet, le 2ème paramètre est correct ( c'est un objet SqlConnection ), par contre le 1er paramètre doit être une instruction T-SQL , ce que n'est pas AuthentificateUser qui , me semble-t-il est le nom de la méthode.
Dans un 1er temps, je vous conseillerais un code de ce type :
SqlConnection conn = new SqlConnection(Globals.ConnectionString());
SqlCommand cmd = new SqlCommand(conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "aspnet_Membership_GetPassword";
J'espère que aspnet_Membership_GetPassword est bien le nom d'une procédure stockée, sinon vous aurez une erreur d'execution.
Pour l'ajout des paramètres à un objet SqlCommand, je suis farouchement contre cette forme abrégée où le 1er paramètre est le nom du paramètre ( correct à 1ère vue ) et le 2ème paramètre la valeur du paramètre, surtout pour une débutante. Depuis la sortie de VS 2003, je n'ai pas changé de méthode de programmation car je suis sûr ( à 99 % ) de ne rien oublier :
SqlParameter m_param = new SqlParameter;
m_param.SqlDbType = SqlDbType.NVarchar;
( ou le type T-SQL utilisé pour le 1er paramètre de la procédure stockée dont le nom a été passé dans cmd.CommandText , c'est la façon la plus sure d'éliminer de possibles problèmes )
m_param.Size = 256;
( où la valeur qui est entre les parenthèses à la fin du nvarchar de la définition du paramètre de la procédure stockée )
m_param.Direction = Parameter.Input ( dans vôtre cas )
mais peut être Output,InputOutput et ReturnValue
m_param.IsNullable = false;
( sûrement dans vôtre cas car je ne vois pas d'intéret à avoir un nom d'utilisateur vide ou à blanc )
m_param.SqlValue = username;
cmd.Parameters.Add(m_param);
faire la même chose avec le 2ème paramètre ( mot de passe )
Pour la suite, je ne peux rien dire car je ne sais pas ce que fait cette procédure stockée , notamment, est-ce qu'elle ne renverrait pas une variable de type bit ( correspondant à Boolean en VC#, dans ce cas, il faudrait l'inclure dans les paramètres ) ?
Autre chose, l'appel à Dispose() pour conn après le Close() ne sert à rien et peut être même source de problème : à supprimer
Vous devriez aussi utiliser le style try/catch/finalize en traitant au moins comme exception Exception ( classe pour les exceptions "génériquesé ) et SqlException ( classe pour les exceptions liées au namespace SqlClient , les propriétés/méthodes utiles : GetBaseException(), Class, ErrorCode, LineNumber, Message, Number, Procedure, Server, Source, StackTrace et éventuellement TargetSite.Name )