为什么这段代码会说“不是所有的代码路径都返回一个值”?
我写下面的代码...但我收到错误,如:为什么这段代码会说“不是所有的代码路径都返回一个值”?
错误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;
}
}
由于函数可能会结束(即,遍历代码路径)而不返回值,您会看到该错误。要修正错误,添加一个else
子句您的条件结束:
if (value == 1)
{
// ...
}
else if (value == 0)
{
// ...
}
else {
// Return a value here.
}
因为如果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次,你就能够得到你需要为了看它是否是一个有效的登录尝试的一切。
@jesse - 我从你的答案中拿出了一些东西,希望你不介意。 – ChaosPandion 2010-03-20 20:43:56
非常感谢... – Kishan 2010-03-22 14:36:17
如果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
}
你可否请修改代码以显示正确使用的使用方式,使Kishan可以学习一些良好的习惯:) – MadBoy 2010-03-20 20:36:43
@MadBoy - 修正了,我不得不全力以赴,因为代码没有遵循适当的约定。 – ChaosPandion 2010-03-20 20:43:10
感谢+1;) – MadBoy 2010-03-20 20:57:58
由于不存在value
一个潜在的不为1或2,你有你的外if
的一个分支,没有return
声明。
您的方法结束时没有return
。如果方法不是void
并且返回值比编译器检查它总是返回一个值。在几种情况下,您的方法可能不会返回值。
你可能知道你的ExecuteScalar调用的结果是0或1,但是编译器不能知道提前。将其他“else if”作为其他标准,或者在方法结束之前提供另一个返回值。
建议您始终以您的方法中的一种方式返回结果。
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;
}
我很少遵循这个*“规则”*。如果我能早点回来,我会的。 – ChaosPandion 2010-03-20 21:03:29
诚实的问题:这是一个公认的和普遍接受的建议,还是仅仅是一种偏好?因为如果情况允许的话,我会看到早期返回函数的价值。 – 2010-03-20 21:05:37
这是否是一个公认的或不公正的。这是一种简单的方法,可以澄清方法过程中何时返回值。不是吗。 – 2010-03-20 21:21:48
作为额外的注意事项确保使用'使用',所以你正确地处理/关闭连接。 U可以在SqlConnection和SqlCommand上使用。那么当你完成这些任务时,你不必使用.Close()。 – MadBoy 2010-03-20 20:32:57