2013-11-03 5 views
1

내 코드에서 간단한 매개 변수화 된 쿼리를 사용합니다.
매개 변수가 많으며 일부는 NULL 일 수 있으며 일부 경우 null 일 경우 FK 일 때 불평합니다.
저장 프로 시저을 사용하지 않고 어떻게이 매개 변수를 선택적 매개 변수로 지정할 수 있습니까? .
명확하게하려면 해당 필드를 업데이트하지 않으려면 매개 변수가 null 인 경우를 원합니다.
parameterizaed 쿼리에서 선택적 매개 변수를 만드는 방법

conn.Open(); 

       string sql = @"UPDATE UserProfile 
           SET FirstName = @p_FirstName 
            ,LastName = @p_LastName 
            ,Gender = @p_Gender 
            ,DateOfBirth = @p_DateOfBirth 
            ,CityId = @p_CityId 
            ,MartialStatusId = @p_MartialStatusId 
            ,ProfileImageId = @p_ProfileImageId 
          WHERE UserId = @p_UserId"; 

       using (SqlCommand cmd = new SqlCommand(sql, conn)) 
       {      
        cmd.Parameters.AddWithValue("@p_FirstName", userProfile.FirstName); 
        cmd.Parameters.AddWithValue("@p_LastName", userProfile.LastName); 
        cmd.Parameters.AddWithValue("@p_Gender", userProfile.Gender); 
        cmd.Parameters.AddWithValue("@p_DateOfBirth", userProfile.DateOfBirth); 
        cmd.Parameters.AddWithValue("@p_CityId", userProfile.CityId); 
        cmd.Parameters.AddWithValue("@p_MartialStatusId", userProfile.MartialStatusId); 
        cmd.Parameters.AddWithValue("@p_ProfileImageId", userProfile.ProfileImageId); 
        cmd.Parameters.AddWithValue("@p_UserId", userProfile.UserId); 

        cmd.ExecuteNonQuery(); 

       } 
+0

_nullable_를 만드는 것으로 해결되지 않습니까? –

+1

슬프게도 null 병합 연산자의 반대가 없습니다. 각 매개 변수에 대해 수동 if (userProfile.FirstName)! = null {}'검사를 수행해야합니다. –

+0

SET FirstName = ISNULL (@p_FirstName, FirstName) , 성 = ISNULL (@p_ 이름, 성) ... 등 – realnumber3012

답변

2

당신은 그들이 할 필요가 없을 때 그렇게하는 선택적 매개 변수가 그것에 결코 당신의 SQL을 구성 할 수 있습니다 더하다.

1

NULL로 설정 매개 변수에 대한 필드 밖으로 -ing NULL을 방지하기 위해 다음과 같이 당신은 당신의 UPDATE 문을 변경할 수 있습니다 :이 매개 변수의 수를 두 배로

UPDATE UserProfile 
SET 
    FirstName = CASE WHEN @p_FirstName_set THEN @p_FirstName ELSE FirstName END 
, LastName = CASE WHEN @p_LastName_set THEN @p_LastName ELSE LastName END 
-- ...and so on 
WHERE UserId = @p_UserId 

을 - 당신이 필요로하는 각 선택적 매개 변수 @XYZ에 대한 @XYZ을 사용하는 경우 1으로 설정하는 @XYZ_set 매개 변수를 추가하거나 @XYZ을 사용하지 않는 경우 0으로 설정하십시오.

if 문을 캡슐화하는 함수를 추가 할 수 있습니다.

이렇게하면 해당 매개 변수가 설정되었는지 여부에 대한 정보가 더 이상 매개 변수 값에 포함되지 않으므로이 방법을 사용하면 값을 NULL으로 설정할 수 있습니다.

설정되는 필드 수에 관계없이 쿼리는 정적으로 유지되므로 RDBMS는 다른 매개 변수 그룹을 설정할 때마다 새 쿼리 계획을 작성하지 않을 수 있습니다. - 당신이 원하지 않는 것을 추가하지 않는 실제 매개 변수

var sql = new StringBuilder(); 
sql.Append(@"UPDATE UserProfile 
       SET "); 

if(addFirstName) // <-- some boolean condition here 
    sql.Append("FirstName = @p_FirstName, "); 

// ... etc... 

sql.Append(" WHERE UserId = @p_UserId"); 

같은 :

관련 문제