2011-12-20 4 views
0

내가 테이블을 조회하고 있다고 가정하고, null이 찾는 값 중 하나 일 수 있습니다. 이처럼 설정된 쿼리매개 변수화 된 쿼리에서 nullable 값을 처리하는 올바른 방법은 무엇입니까?

인사말이 null 인 경우 결과를 반환하지 않습니다. 그래서 내가 대신이 작업을 수행하는 경향이있어, 그러나 그것은 나에게 추한 느낌 :

string whereClause; 
if(!string.IsNullOrEmpty(salutation)) 
{ 
    whereClause = "Salutation = @salutation"; 
    command.Parameters.AddWithValue("@salutation", salutation); 
} 
else whereClause = "Salutation is null"; 

command.CommandText = "select * from People where " + whereClause; 

더 정확한 방법이 있나요?

답변

3

where 절을 작성하기 위해 연결을 피할 것입니다. SQL을 다음과 같이 변경할 수 있습니다. SQL Injections 공격을 위해 자신을 열 수 있습니다.

command.CommandText = "select * from People where (@salutation is null and salutation is null) or Saluation = @salutation"; 
+1

외부 문자열을 연결하지 않으면 병합으로 인해 삽입 취약점이 생성되지 않습니다. –

+0

사실, 나쁜 습관에 빠지기가 더 쉽습니다. –

+0

원본 버전은 @salutation이 null 일 때 모든 행을 반환합니다. @salutation은 null이고 salutation은 null이어야합니다. 방금 편집본을 게시하고 동료 검토를 거치면 동의 할 것입니다. –

0

아마도 COALESCE 함수를 사용하여 기본값을 두 번째 매개 변수로 설정할 수 있습니다.

1

null 값을 반환할지 여부를 지정하는 추가 매개 변수를 추가하고 쿼리를 약간 수정할 수 있습니다. 이 수

command.CommandText = "select * from People where ((@IsNull_Salutation = 1 AND Salutation IS NULL) OR (Saluation = @Salutation))"; 

command.Parameters.AddWithValue("Salutation", salutation ?? (object)DBNull.Value); 
command.Parameters.AddWithValue("IsNull_Salutation", (salutation == null) ? 1 : 0); 

당신이 당신의 쿼리가 완전히 매개 변수화 유지 :

은 예제를 사용합니다. null 값을 반환하지 않기로 결정했다면 전달한 값을 IsNull_Salutation 매개 변수로 변경하기 만하면됩니다.

메모리에서 이것은 자동 생성 된 삽입/업데이트/삭제 쿼리에서 SqlCommandBuilder 클래스가 Null 값을 처리하는 것과 유사합니다.

-1
command.CommandText = "select * from People where Saluation "; 
command.CommandText += salutation != null ? ("= " + salutation) : "is NULL"; 
+4

내가 가장 좋아하는 인사말 인 '1; drop table people;' – MatthewKing

+2

-1. 매개 변수화 된 쿼리를 사용하지 않고 Joviee가 Soylent Green을 파괴 할 수 있도록 허용합니다. –

0

간단하게 : 그냥

WHERE @field IS NULL OR field = @field 

SQL Server가 @field 매개 변수의 값에 따라 적절한 조건을 사용 똑똑 같은 WHERE 절을 사용합니다. 이 시나리오의 중요한 점은 SELECT stmt에서 사용되기 전에 쿼리에서 매개 변수 값을 변경하지 않는 것입니다.

관련 문제