2013-02-15 5 views
3

프로젝트에서 매개 변수화 된 쿼리를 사용하여 SQL 삽입을 방지하고 쿼리로 흥미로운 시나리오를 실행했습니다. 어떤 경우에는 다른 항목보다 매개 변수가 많은 쿼리가 있습니다. 즉 where 절이 변경됩니다. 다음 두 코드 블록간에 성능이나 기타 차이가 있습니까? 이 코드는 객체 안에 있으므로 "변수"는 속성이고 두 메서드 모두 액세스 할 수 있습니다.SQL 매개 변수화 된 쿼리. 불필요한 매개 변수 추가하기

이 조건에서는 조건이 충족 될 경우에만 매개 변수를 추가합니다.

public bool TestQuery() 
    { 
     SqlCommand command = new SqlCommand(); 
     string query = GetQuery(command); 
     command.CommandText = query; 
     //execute query and other stuff 
    } 
    private string GetQuery(SqlCommand command ) 
    { 
     StringBuilder sb = new StringBuilder("SELECT * FROM SomeTable WHERE Active = 1 "); 
     if (idVariable != null) 
     { 
      sb.Append("AND id = @Id"); 
      command.Parameters.Add("@Id", SqlDbType.Int).Value = idVariable; 
     } 
     if (!string.IsNullOrEmpty(colorVariable)) 
     { 
      sb.Append("AND Color = @Color"); 
      command.Parameters.Add("@Color", SqlDbType.NVarChar).Value = colorVariable; 
     } 
     if (!string.IsNullOrEmpty(sizeVariable)) 
     { 
      sb.Append("AND Color = @Size"); 
      command.Parameters.Add("@Size", SqlDbType.NVarChar).Value = sizeVariable; 
     } 
     return sb.ToString(); 
    } 

이 경우 나는 모든 매개 변수를 매번 추가하고 조건이 충족 될 경우에만 where 절 인수 만 추가합니다.

public bool TestQuery() 
    { 
     SqlCommand command = new SqlCommand(GetQuery()); 
     command.Parameters.Add("@Id", SqlDbType.Int).Value = idVariable; 
     command.Parameters.Add("@Color", SqlDbType.NVarChar).Value = colorVariable; 
     command.Parameters.Add("@Size", SqlDbType.NVarChar).Value = sizeVariable; 
     //execute query and other stuff 
    } 
    private string GetQuery() 
    { 
     StringBuilder sb = new StringBuilder("SELECT * FROM SomeTable WHERE Active = 1 "); 
     if (idVariable != null) 
      sb.Append("AND id = @Id"); 
     if (!string.IsNullOrEmpty(colorVariable)) 
      sb.Append("AND Color = @Color"); 
     if (!string.IsNullOrEmpty(sizeVariable)) 
      sb.Append("AND Color = @Size"); 
     return sb.ToString(); 
    } 

테스트에 따르면 둘 중 하나가 작동합니다. 개인적으로 두 번째를 선호하기 때문에 더 깨끗하고 읽기 쉽지만 일부 성능/보안상의 이유로 사용되지 않는 매개 변수를 추가해서는 안되며 아마도 null/빈 문자열이 될지 궁금합니다.

+0

첫 번째 선택은 내 취향이 될 것입니다 .. beargle의 대답은 정말 내 상황에서 작동하지 않기 때문에 그때 HABO의 의견에 따라 옵션 중 하나와 함께 갈 것 같아요. 매개 변수를 사용하는 코드와 함께 유지하며 의도하지 않게 매개 변수를 참조하기가 더 어려워 야합니다. 누군가가 유지 보수를 할 때. 또한 값이 없거나 얻을 값이 비싼 매개 변수를 채우는 방법에 대한 질문은 피할 수 있지만 쿼리에서는 사용하지 않습니다. 일반적으로 말하면 성능과 보안이 어느 쪽의 방법 으로든 겪어서는 안됩니다. SQL 주입을 허용하도록 코드가 수정 된 경우 영리한 (ab) 사용자는 사용하지 않더라도 제공된 매개 변수에 액세스 할 수 있습니다. – HABO

답변