2010-07-12 4 views
0

Bonjour, je suis juste étudiant 3-tier application. J'ai maintenant un problème avec ce formulaire de connexion simple. Je viens toujours avec cette erreur:Comment réparer ce formulaire de connexion à trois niveaux?

Entities.Entities is a type but is not like used like a variable.

Montre toujours: ID utilisateur est incorrect.

public int SearchEntry(UsersEntity UserEntity) 
{ 
    SqlConnection con = new SqlConnection(); 
    con.ConnectionString = connStr; 

    try 
    { 
    SqlCommand cmd = new SqlCommand("sp_SelectUser", con); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.Add("@User", SqlDbType.VarChar, 50).Value = UserEntity.UserName; 
    cmd.Parameters.Add("@Pass", SqlDbType.VarChar, 50).Value = UserEntity.Password ; 

    SqlParameter p1 = new SqlParameter("ret", SqlDbType.Int); 
    p1.Direction = ParameterDirection.ReturnValue; 
    cmd.Parameters.Add(p1); 

    con.Open(); 
    cmd.ExecuteNonQuery(); 
    Convert.ToInt32(cmd.Parameters["ret"].Value); 

    int s = cmd.ExecuteNonQuery(); 
    cmd.Dispose(); 

    return s; 
    } 
    catch (SqlException) 
    { 
    throw; 
    } 
    finally 
    { 
    con.Close(); 
    con.Dispose();     
    } 

------------------------------------------------------------------------------------------ 
public class BLL 
{ 
    public int SearchEntry(UsersEntity UserEnity) 
    { 
    DAL pDAL = new DAL(); 

    int i = pDAL.SearchEntry(UserEnity); 
    return i;    
    }  
} 

------------------------------------------------------------------------------------------- 
PRESENTATION LAYER: 

private void btnLogin_Click(object sender, EventArgs e) 
{ 
    BLL aBl = new BLL(); 

    UsersEntity uEt = new UsersEntity();    
    uEt.UserName = txtUser.Text; 
    uEt.Password = txtPass.Text; 

    int r = ****(int)aBl.SearchEntry(uEt.UserName,uEt.Password);**** 
    if (r == -1) 
    { 
    MessageBox.Show("Incorrect User Id"); 
    } 
    else if (r == -2) 
    { 
    MessageBox.Show("Incorrect Password"); 
    } 
    else if (r == 1) 
    { 
    MessageBox.Show("Welcome");  
    } 
    else 
    { 
    MessageBox.Show("Incorrect User Id/Password "); 
    }     
} 

procédure stockée code

ALTER PROCEDURE [dbo].[sp_SelectUser] 
-- Add the parameters for the stored procedure here 
     @User VARCHAR(50), 
     @Pass VARCHAR(50) 
AS 
     DECLARE @Ap AS VARCHAR(50) 

     -- SET NOCOUNT ON added to prevent extra result sets from 
     -- interfering with SELECT statements. 
     -- Insert statements for procedure here 
     SELECT @Ap = @Pass 
     FROM InventoryManager.dbo.Users 
     WHERE UserName = @User 

     IF @Ap IS NULL 
     RETURN -1 
     ELSE 
     IF @[email protected] 
     RETURN 1 
     ELSE 
     RETURN -2 
+0

Pouvez-vous coller la ligne de code spécifique sur laquelle le compilateur échoue? – Sam

+0

BLL aBl = nouvelle BLL(); UsersEntity utilisateur = new UsersEntity(); user.UserName = txtUser.Text; user.Password = txtPass.Text; int r = aBl.SearchEntry (UsersEntity); Aucune surcharge pour Method'Search Entry ' Entities.UserEntity est un' type 'mais n'est pas utilisé comme une variable – Crimsonland

+1

Par ailleurs, vous avez posé 10 questions sur SO et vous n'avez jamais accepté de réponse. Je ne pense pas que vous obtiendrez beaucoup plus d'aide si vous ne récompensez pas les répondeurs. –

Répondre

2

L'erreur que vous recevez est parce que SearchEntry() a besoin d'un UsersEntity en tant que paramètre, mais vous l'appelez avec deux chaînes.

Essayez de remplacer:

int r = ****(int)aBl.SearchEntry(uEt.UserName,uEt.Password);**** 

avec:

int r = (int)aBl.SearchEntry(uEt); 

Cela étant dit, il peut y avoir plus d'erreurs dans votre code.

+0

Je viens de remplacer cela, mais il va toujours sur la boîte de message: Id d'utilisateur incorrect – Crimsonland

+0

Dans SearchEntry(), essayez return (int) p1.Value; au lieu de retourner s; Mais encore une fois, il peut y avoir plus d'erreurs. –

1

Ce bit de code semble douteux.

  con.Open(); 
      cmd.ExecuteNonQuery(); 
      Convert.ToInt32(cmd.Parameters["ret"].Value); 

      int s = cmd.ExecuteNonQuery(); 
      cmd.Dispose(); 
      return s; 

Vous appelez deux fois ExecuteNonQuery. et en convertissant cmd.Parameters["ret"].Value à un int, mais ne pas affecter le résultat à quoi que ce soit

Pouvez-vous publier le code de procédure stockée afin que nous puissions voir l'intention?

Modifier

J'ai marqué ma réponse CW que je n'ai pas le temps ni l'envie de répondre à toutes les questions, mais à part les points ci-dessus et l'erreur que vous obtenez sur « Entities.Entities '

cette procédure stockée semble vouée à l'échec et

SELECT @Ap = @Pass 
    FROM InventoryManager.dbo.Users 
    WHERE UserName = @User 

Si une bonne passe UserName en elle établira la @Ap variable à la valeur de la variable @Pass vous avez initialement pas sed in (sans vérifier la valeur stockée dans la table du tout) et retourner 1. Je doute que ce soit l'intention?

Je devrais probablement mentionner qu'il est décidément pas de meilleure pratique pour stocker les mots de passe en texte clair.

+0

ALTER PROCEDURE [dbo].[Sp_SelectUser] \t \t - Ajoutez les paramètres de la procédure stockée ici \t @user varchar (50), \t @Pass varchar (50) AS DECLARE @Ap varchar (50) \t - SET NOCOUNT ON a été ajouté pour empêcher les ensembles de résultats supplémentaires de \t - d'interférer avec les instructions SELECT. - Insérer des déclarations pour la procédure ici SELECT @Ap = @Pass de InventoryManager.dbo.Users où UserName = @user \t si @Ap est nul \t retour -1 \t autre \t si @ Ap = @ Passe \t return 1 \t else \t return -2 – Crimsonland

+0

Que doit-on faire? – Crimsonland

Questions connexes