【问题标题】:C# not all code paths return a valueC# 并非所有代码路径都返回一个值
【发布时间】:2016-08-02 07:33:17
【问题描述】:

我正在尝试检查我的数据库中是否存在具有给定密码的用户名,如果存在则应返回 true,否则应返回 false。

我当前的函数如下所示:

public bool user_check(string username, string password)
{
    string query = "SELECT username, password from swear_tool where username='" + username + "' and password = '" + password + "'";

    if (this.OpenConnection() == true)
    {
        MySqlCommand cmd = new MySqlCommand(query, connection);
        MySqlDataReader dataReader = cmd.ExecuteReader();
        if (dataReader.HasRows)
        {
            while (dataReader.Read())
            {
                return true;
            }
        }
        else
        {
            return false;
        }
        dataReader.Close();
        this.CloseConnection();
    }
}

但我收到以下错误消息:

错误 CS0161 'database_connector.user_check(string, string)': 不是全部 代码路径返回值

我做错了什么?

【问题讨论】:

  • 如果OpenConnection 不返回true 会返回什么?
  • 返回时,低于它的任何内容都将被忽略。因此您还会收到一条错误消息,提示无法在最后两行访问代码

标签: c#


【解决方案1】:

只需在末尾添加return false;。你也不需要内部 if 中的else return false

public bool user_check(string username, string password)
{
    string query = "SELECT username, password from swear_tool where username='" + username + "' and password = '" + password + "'";

    if (this.OpenConnection())
    {
        MySqlCommand cmd = new MySqlCommand(query, connection);
        MySqlDataReader dataReader = cmd.ExecuteReader();
        if (dataReader.HasRows)
        {
            while (dataReader.Read())
            {
                return true;
            }
        }
        dataReader.Close();
        this.CloseConnection();
    }

    return false;
}

还要看到,如果你有记录,那么你会返回true,并且永远不会关闭你的连接和对象。也许可以这样做:

public bool user_check(string username, string password)
{
    string query = "SELECT username, password from swear_tool where username='" + username + "' and password = '" + password + "'";

    bool hasRecords = false;

    if (this.OpenConnection())
    {
        MySqlCommand cmd = new MySqlCommand(query, connection);
        MySqlDataReader dataReader = cmd.ExecuteReader();
        if (dataReader.HasRows)
        {
            while (dataReader.Read())
            {
                hasRecords = true;
                break;
            }
        }
        dataReader.Close();
        this.CloseConnection();
    }
    return hasRecords;
}

最后一件事:查看 Parameterized Queires 以避免 SQL 注入

【讨论】:

    【解决方案2】:

    只需在方法末尾添加一个return false即可:

    public bool user_check(string username, string password)
    {
        string query = "SELECT username, password from swear_tool where username='" + username + "' and password = '" + password + "'";
    
        if (this.OpenConnection() == true)
        {
            MySqlCommand cmd = new MySqlCommand(query, connection);
            MySqlDataReader dataReader = cmd.ExecuteReader();
            if (dataReader.HasRows)
            {
                while (dataReader.Read())
                {
                    return true;
                }
            }
            else
            {
                return false;
            }
            dataReader.Close();
            this.CloseConnection();
        }
        return false;  //<<---- This is where it does not know what to do if any above conditions fail.
    }
    

    【讨论】:

      【解决方案3】:

      如果此检查返回 false:

       if (this.OpenConnection() == true)
      

      你没有返回任何东西就退出了。

      【讨论】:

        【解决方案4】:

        Error CS0161 在其签名中指定返回类型的函数包含通过不返回值的函数的路径时发生。在您的情况下,当 this.OpenConnection() 方法返回 false 时,您的函数不会返回值。

        为防止编译器报告此错误,所有路径都应返回一个值:

        public bool user_check(string username, string password)
        {
            string query = "SELECT username, password from swear_tool where username='" + username + "' and password = '" + password + "'";
        
            if (this.OpenConnection() == true)
            {
                MySqlCommand cmd = new MySqlCommand(query, connection);
                MySqlDataReader dataReader = cmd.ExecuteReader();
                if (dataReader.HasRows)
                {
                    while (dataReader.Read())
                    {
                        return true;
                    }
                }
                else
                {
                    return false;
                }
                dataReader.Close();
                this.CloseConnection();
            }
            return false;
        }
        

        借此机会让您了解一下 SQL 注入

        您的代码容易受到 SQL 注入的影响,因为您将用户输入连接到查询中。我们鼓励您使用参数化查询,有关此主题的更多信息,请查看this link

        【讨论】:

        • 您的代码仍然会出现异常..您忘记了它不会输入OpenConnection == true if的情况
        • @GiladGreen 我打算在我输入答案正文时将 return false 放在那里,但忘记将其实际添加到代码中。感谢您的编辑:)
        【解决方案5】:

        那是因为你只在 if while 块内写你的return。此外我建议你使用参数化查询

        public bool user_check(string username, string password){
            string query = "SELECT username, password From swear_tool Where "+
                           "username=@uname and password=@password";
            if (this.OpenConnection() == true){
                using(MySqlCommand cmd = new MySqlCommand(query, connection)){
                    cmd.Parameters.AddWithValue("@uname",usename);
                    cmd.Parameters.AddWithValue("@password",password);
                    using(MySqlDataReader dataReader = cmd.ExecuteReader()){
                        if (dataReader.HasRows){
                            while(dataReader.Read()){
                                return true;
                            }
                        }
                    }
                }
                this.CloseConnection();                    
            }
            return false;
        }
        

        又好又干净又安全又短

        【讨论】:

          【解决方案6】:

          当用户存在时,上一个答案不会关闭连接。 试试这个:

              public bool user_check(string username, string password)
              {
                  string query = "SELECT username, password from swear_tool where username='" + username + "' and password = '" + password + "'";
          
                  if (this.OpenConnection())
                  {
                      try
                      {
                          using (MySqlCommand cmd = new MySqlCommand(query, connection))
                          {
                              using (MySqlDataReader dataReader = cmd.ExecuteReader())
                              {
                                  if (dataReader.HasRows)
                                  {
                                      while (dataReader.Read())
                                      {
                                          return true;
                                      }
                                  }
                              }
                          }
          
                      }
                      finally
                      {
                          this.CloseConnection();
                      }
                  }
                  return false;
              }
          

          【讨论】:

            猜你喜欢
            • 2017-07-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-17
            • 1970-01-01
            相关资源
            最近更新 更多