C# 为什么这个代码块会显示“quot;并非所有代码路径都返回一个值";?
我写了以下代码…但我得到的错误如下: 错误1“LoginDLL.Class1.Login(string,string,string)”:并非所有代码路径都返回值 请帮帮我 先谢谢你 我的代码如下所示C# 为什么这个代码块会显示“quot;并非所有代码路径都返回一个值";?,c#,asp.net,C#,Asp.net,我写了以下代码…但我得到的错误如下: 错误1“LoginDLL.Class1.Login(string,string,string)”:并非所有代码路径都返回值 请帮帮我 先谢谢你 我的代码如下所示 public int Login(string connectionString,string username,string password) { SqlConnection con=new SqlConnection(connectionString); con.Open();
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;
}
}
因为如果
值
变量等于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;
}
您只需查询数据库一次,就可以获得所需的一切,以查看它是否是有效的登录尝试。如果
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或2,并且如果在方法末尾没有返回
,则外部分支没有返回
语句。若方法不是void
并返回一些值,编译器会检查它是否总是返回一个值。在某些情况下,您的方法可能不会返回值。您会收到错误,因为函数可能在不返回值的情况下结束(即遍历代码路径)。要修复此错误,请在条件的末尾添加一个else
子句:
if (value == 1)
{
// ...
}
else if (value == 0)
{
// ...
}
else {
// Return a value here.
}
您可能知道ExecuteScalar调用的结果是0或1,但编译器无法事先知道这一点。将“else if”设置为标准else,或在方法结束前提供另一个返回值。建议始终使用方法中的一种方式返回结果
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;
}
作为附加说明,请确保使用使用,以便正确处理/关闭连接。U可以在SqlConnection和SqlCommand上使用。完成后,您不必使用.Close()来处理上述任何一项。请修改代码以显示正确的使用方法,以便Kishan可以学习一些好习惯:)@MadBoy-Fixed,我不得不全力以赴,因为代码没有遵循适当的约定。@MadBoy-我们将不得不忽略他们存储纯文本密码的事实。一步一步地走下去。有一件事要考虑的是,你给用户提供的信息越多,你给坏人提供的信息就越多。如果一个坏蛋知道登录尝试失败是因为密码,那么他们知道他们只需要处理其中的用户名部分。-这在某些web应用程序中可能并不重要,但这只是一个值得思考的问题。@jesse-我从你的答案中得到了一些东西,希望你不要介意。我很少遵循这个“规则”。如果我能早点回来,我会的。诚实的问题:这是一个公认的、普遍接受的建议,还是仅仅是一种偏好?因为我看到了在情况允许的情况下尽早返回函数的价值。无论它是否只是一个公认的函数。这是一种简单的方法,可以明确在方法过程中何时返回值。不是吗。