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