开发者

Why does this code block say "not all code paths return a value"?

开发者 https://www.devze.com 2022-12-23 08:25 出处:网络
I wrote following code...but i am getting Error like: Error 1 \'LoginDLL.Class1.Login(string, string, string)\': not all code paths return a value

I wrote following code...but i am getting Error like:

Error 1 'LoginDLL.Class1.Login(string, string, string)': not all code paths return a value

Please help me...

Thanks in advance...

My code is as given below...

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 v开发者_StackOverflow社区alue=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;

    }
}


What if value == 3?

You could rewrite the code like this:

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
}


Because if the value variable were equal to 3 your method wouldn't return anything.

And just for kicks, here's a short rewrite of your code that I think would work splendid.

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;
}

You only query the database 1 time and you're able to get everything you need in order to see if it's a valid login attempt.


You get the error because it is possible for the function to end (that is, traverse a code path) without returning a value. To fix the error, add an else clause to the end of your conditional:

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


You may know that the result of your ExecuteScalar call is 0 or 1, but the compiler cannot know that in advance. Make your "else if" a standard else or provide another return value before the end of the method.


Because there is a potential for value to not be 1 or 2, and you have no return statement for that branch of your outer if.


You don't have return at the end of your method. If method is not void and returning some value than compiler checks that it always returns a value. Your method may not return value in several cases.


It's recommended that always return your result with ONLY ONE way in your method.

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;
}
0

精彩评论

暂无评论...
验证码 换一张
取 消