2010-06-03 3 views
1

사용자가 올바른 암호를 가지고 있는지 확인하기 위해 호출되는이 간단한 메서드가 있습니다. 왜 작동하지 않는지에 대한 도움이 필요하십니까? 이것은 Microsoft SQL Server 용입니다.SQL 문에 문제가있어 작동하지 않습니다.

public bool UserNameExists() 
    { 
     using (SqlConnection con = new SqlConnection("CONNECTION STRING AQUI!")) 
     { 
      con.Open(); 
      try 
      { 
       using (SqlCommand command = new SqlCommand(string.Format("SELECT * FROM Policia WHERE NumeroPlaca = '{0}' AND Password = '{1}'", Session.Contents["username"], Session.Contents["password"]), con)) 
       { 
        SqlDataReader reader = command.ExecuteReader(); 
        if (reader.FieldCount > 0) 
        { 
         return true; 
        } 
        else 
        { 
         return false; 
        } 
       } 
      } 
      catch 
      { 

      } 

      return false; 
     } 
    } 
+8

정의하는 "작동하지 않는". 그것은 추락합니까? 예외? (그렇다면 세부 정보를 게시하십시오), 데이터가 생성되지 않습니까? 잘못된 결과를 주시겠습니까? (그렇다면 무엇을 얻었고 무엇을 기대했는지 게시하십시오.) –

+0

작동하지 않는 부분은 무엇입니까? 빈 catch 블록을 제거 할 때 오류가 발생합니까? 사용자 이름과 비밀번호는 "안전한"문자 만 포함하도록 보장됩니까? –

+7

코드에 많은 문제가 있습니다. 첫째, SQL 인젝션이 아닌 매개 변수를 사용해야합니다. 그렇지 않으면 작은 Bobby Tables (http://xkcd.com/327/)가 데이터베이스를 완전히 죽일 것입니다. 둘째, 당신은 결코 그런 예외를 삼켜서는 안되며, 특정 예외 만 처리하면됩니다. 셋째, 일치하는 행이 있는지만을 알고 싶다면'SELECT *'을 사용하면 안되며, 필요한 것보다 더 많은 데이터를 검색하게됩니다. 간단한 'SELECT 1 AS x'조차도 충분합니다. –

답변

3

FieldCount는 현재 행의 열 수를 가져옵니다. 항상 0이 아닙니다. 결과 집합의 행 수를 찾고 있습니다. HasRows 속성을 사용하십시오.

+0

잘 작동 해 주셔서 감사합니다. :디 –

4

당신은 할 수 : 다음

"SELECT COUNT(*) FROM Policia..." 

과 :

int result = Convert.ToInt32(command.ExecuteScalar()); 
if (result > 0) 
{ 
    return true; 
} 
else 
{ 
    return false; 
} 

전체 코드 :

public bool UserNameExists() 
{ 
    int result = int.MinValue; 

    using (SqlConnection connection = new SqlConnection(_connectionString)) 
    { 
    connection.Open(); 
    SqlCommand command = new SqlCommand(); 
    command.Connection = connection; 
    command.CommandType = CommandType.StoredProcedure; 
    command.CommandText = "SELECT COUNT(*) FROM Policia WHERE NumeroPlaca = @username AND Password = @password"; 
    command.Parameters.Clear(); 
    command.Parameters.Add("@username", SqlDbType.VarChar).Value = Session.Contents["username"]; 
    command.Parameters.Add("@password", SqlDbType.VarChar).Value = Session.Contents["password"]; 
    result = Convert.ToInt32(command.ExecuteScalar()); 
    } 

    if (result > 0) 
    { 
    return true; 
    } 
    { 
    return false; 
    } 
} 
관련 문제