2016-08-02 10 views
-4

私のデータベースには、指定されたパスワートのユーザー名が存在するかどうかをチェックしています。存在する場合はtrueを返します。 'database_connector.user_check(文字列、文字列')C#すべてのコードパスが値を返すわけではありません

エラーCS0161:

私の現在の機能は次のようになります。

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

しかし、私は次のエラーメッセージが表示されていないすべての コードをパスは値を返します

私は間違っていますか?

+1

もし 'OpenConnection'が' true'を返さない場合、返されるものは? –

+0

戻ったとき、それ以下のものは無視されます。あなたはまた、最後の2行でコードに到達することができないというエラーを受け取るでしょう – spatbord

答えて

3

最後に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を返さないし、決してあなたの接続オブジェクトを閉じていることがわかります。また、あなたは、内側に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 + "'"; 

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

最後の事:SQLインジェクションを防ぐためにParameterized Queiresに見

2

ただ、メソッドの最後にリターン偽を追加します。

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. 
} 
1

このチェックがfalseを返す場合:

if (this.OpenConnection() == true) 

あなた出口は何も返さず。

1

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インジェクションへ。あなたは、あなたのreturnif内部whileブロックを書いているので、私はあなたが

public bool user_check(string username, string password){ 
    string query = "SELECT username, password From swear_tool Where "+ 
        "[email protected] and [email protected]"; 
    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; 
} 

ニースパラメータ化クエリを使用することをお勧めonly.Besidesだアウトこのトピックチェックthis link

+1

あなたのコードはまだ例外を取得します..もしあなたが 'OpenConnection == true'に入っていない場合を忘れた場合 –

+0

@ GiladGreen私は自分の答えの本文を入力したが、コードに実際に追加するのを忘れてしまったので、そこにfalseを返すことが私の意図だった。編集ありがとうございます:) – Wazner

0

の詳細については、パラメータ化クエリを使用することを奨励していますおよび清潔で安全で短く

0

前の回答は、ユーザーが存在するときに接続を閉じません。 これを試してください:

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; 
    } 
関連する問題