我写了以下代码......但我得到的错误就像:
错误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;
}
}
答案 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;
}