为什么这个代码块会说“并非所有代码路径都返回一个值”?

时间:2010-03-20 20:21:44

标签: c# asp.net

我写了以下代码......但我得到的错误就像:

错误1'LocinDLL.Class1.Login(string,string,string)':并非所有代码路径都返回值

请帮帮我......

提前致谢...

我的代码如下所示......

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 username=@username", 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 username=@username", 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;

    }
}

7 个答案:

答案 0 :(得分: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 username=@username";
            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
}

答案 1 :(得分: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 username=@username";
    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;
}

您只查询数据库一次,并且您能够获得所需的一切,以查看它是否是有效的登录尝试。

答案 2 :(得分:2)

您收到错误,因为函数可以在不返回值的情况下结束(即遍历代码路径)。要修复错误,请在条件结尾处添加else子句:

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

因为value可能不是1或2,并且您的外return的该分支没有if语句。

答案 5 :(得分:0)

您的方法结尾处没有return。如果method不是void并返回一些值而不是编译器检查它总是返回一个值。在某些情况下,您的方法可能无法返回值。

答案 6 :(得分: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 username=@username", 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 username=@username", 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;
}