2010-03-20 90 views
3

我写下面的代码...但我收到错误,如:为什么这段代码会说“不是所有的代码路径都返回一个值”?

错误1“LoginDLL.Class1.Login(字符串,字符串,字符串)”:不是所有的代码路径返回一个值

请帮我...提前

谢谢...作为如下

我的代码...

public int Login(string connectionString,string username,string password) 
{ 
    SqlConnection con=new SqlConnection(connectionString); 
    con.Open(); 

    SqlCommand validUser = new SqlCommand("SELECT count(*) from USER where [email protected]", con); 
    validUser.Parameters.AddWithValue("@username", username); 
    int value=Convert.ToInt32(validUser.ExecuteScalar().ToString()); 
    if (value == 1) 
    { 
     //check for password 
     SqlCommand validPassword = new SqlCommand("SELECT password from USER where [email protected]", con); 
     validPassword.Parameters.AddWithValue("@username", username); 
     string pass = validPassword.ExecuteScalar().ToString(); 
     if (pass == password) 
     { 
      //valid login 
      return 1; 
     } 
     else 
     { 
      return 0; 
     } 
    } 
    else if (value == 0) 
    { 
     return 2; 

    } 
} 
+4

作为额外的注意事项确保使用'使用',所以你正确地处理/关闭连接。 U可以在SqlConnection和SqlCommand上使用。那么当你完成这些任务时,你不必使用.Close()。 – MadBoy 2010-03-20 20:32:57

回答

2

由于函数可能会结束(即,遍历代码路径)而不返回值,您会看到该错误。要修正错误,添加一个else子句您的条件结束:

if (value == 1) 
    { 
     // ... 
    } 
    else if (value == 0) 
    { 
     // ... 
    } 
    else { 
     // Return a value here. 
    } 
6

因为如果value变量等于3,你的方法不会返回任何东西。

只是踢,这是我认为将工作出色的短代码的重写。

public int Login(string connectionString,string username,string password) 
{ 
    using(var con = new SqlConnection(connectionString)) { 
    con.Open(); 
    var cmdText = "SELECT password from USER where [email protected]"; 
    using (var cmd = new SqlCommand(cmdText, con)) { 

     cmd.Parameters.AddWithValue("@username", username); 
     object passwordFromDb = userCmd.ExecuteScalar(); 
     if (passwordFromDb != null) { 
      if (password == passwordFromDb.ToString()) { 
      return 1; 
      } 
     } 
    } 
    } 
    return 0; 
} 

你只查询数据库1次,你就能够得到你需要为了看它是否是一个有效的登录尝试的一切。

+0

@jesse - 我从你的答案中拿出了一些东西,希望你不介意。 – ChaosPandion 2010-03-20 20:43:56

+0

非常感谢... – Kishan 2010-03-22 14:36:17

12

如果value == 3怎么办?

你可以改写这样的代码:

public LoginResult Login(string connectionString, string username, string password) 
{ 
    if (string.IsNullOrEmpty(username) 
    { 
     return LoginResult.InvalidUser; 
    } 
    else if (string.IsNullOrEmpty(password) 
    { 
     return LoginResult.InvalidPassword; 
    } 

    using (var connection = new SqlConnection(connectionString)) 
    { 
     connection.Open(); 

     using (var command = connection.CreateCommand()) 
     { 
      command.CommandText = "SELECT password from USER where [email protected]"; 
      command.Parameters.AddWithValue("@username", username); 
      var actualPassword = (string)command.ExecuteScalar(); 

      if (actualPassword == null) 
      { 
       return LoginResult.InvalidUser; 
      } 
      else if (password != actualPassword) 
      { 
       return LoginResult.InvalidPassword; 
      } 
      else 
      { 
       return LoginResult.Success; 
      } 
     } 
    } 
} 

public enum LoginResult 
{ 
    Success, 
    InvalidPassword, 
    InvalidUser 
} 
+0

你可否请修改代码以显示正确使用的使用方式,使Kishan可以学习一些良好的习惯:) – MadBoy 2010-03-20 20:36:43

+0

@MadBoy - 修正了,我不得不全力以赴,因为代码没有遵循适当的约定。 – ChaosPandion 2010-03-20 20:43:10

+0

感谢+1;) – MadBoy 2010-03-20 20:57:58

0

由于不存在value一个潜在的不为1或2,你有你的外if的一个分支,没有return声明。

0

您的方法结束时没有return。如果方法不是void并且返回值比编译器检查它总是返回一个值。在几种情况下,您的方法可能不会返回值。

1

你可能知道你的ExecuteScalar调用的结果是0或1,但是编译器不能知道提前。将其他“else if”作为其他标准,或者在方法结束之前提供另一个返回值。

0

建议您始终以您的方法中的一种方式返回结果。

public int Login(string connectionString,string username,string password) 
{ 
    int result = 0; //Default result value. 

    SqlConnection con=new SqlConnection(connectionString); 
    con.Open(); 

    SqlCommand validUser = new SqlCommand("SELECT count(*) from USER where [email protected]", con); 
    validUser.Parameters.AddWithValue("@username", username); 
    int value=Convert.ToInt32(validUser.ExecuteScalar().ToString()); 
    if (value == 1) 
    { 
     //check for password 
     SqlCommand validPassword = new SqlCommand("SELECT password from USER where [email protected]", con); 
     validPassword.Parameters.AddWithValue("@username", username); 
     string pass = validPassword.ExecuteScalar().ToString(); 
     if (pass == password) 
     { 
      //valid login 
      result = 1; 
     } 
     //It is not necessary in this case 
     //else 
     //{ 
     // result = 0; 
     //} 
    } 
    else if (value == 0) 
    { 
     result = 2; 

    } 

    return result; 
} 
+0

我很少遵循这个*“规则”*。如果我能早点回来,我会的。 – ChaosPandion 2010-03-20 21:03:29

+0

诚实的问题:这是一个公认的和普遍接受的建议,还是仅仅是一种偏好?因为如果情况允许的话,我会看到早期返回函数的价值。 – 2010-03-20 21:05:37

+0

这是否是一个公认的或不公正的。这是一种简单的方法,可以澄清方法过程中何时返回值。不是吗。 – 2010-03-20 21:21:48

相关问题