2014-07-11 3 views
0

나는 Subject 클래스를가집니다. 먼저null 매개 변수를 저장 프로 시저에 보냄

public bool AddNewNews(News news, List<Subject> subject) 
{ 
     SqlParameter[] parameters = new SqlParameter[] 
     { 
      new SqlParameter ("@title",news.Title), 
      new SqlParameter ("@text",news.Text), 
      new SqlParameter ("@year",news.Year),  
      new SqlParameter ("@month",news.Month) ,  
      new SqlParameter ("@day",news.Day) , 
      new SqlParameter ("@id_writer",news.Id_writer) , 
      new SqlParameter ("@id_subject1",subject[0]!=null? subject[0].Id_subject:null), 
      new SqlParameter ("@id_subject2",subject[1]!=null? subject[1].Id_subject:null) , 
      new SqlParameter ("@id_subject3",subject[2]!=null? subject[2].Id_subject:null), 
      new SqlParameter ("@id_subject4",subject[3]!=null? subject[3].Id_subject:null), 
      new SqlParameter ("@id_subject5",subject[4]!=null? subject[4].Id_subject:null) 
    }; 

    return SqlDBHelper.ExecuteNonQuery("AddNewNews", CommandType.StoredProcedure, parameters); 
} 

: 그것은 회원 id_subject (int)와

그들 subjectName (string)

내가 목록

List<Subject> listSubject = new List<Subject>(); 

를 작성하고이 저장 프로 시저로 보내하다의 사실이 아니다 짧은 경우

개체에 캐스팅하고 저장 프로 시저로 전송

BEGIN TRANSACTION; 

    DECLARE @last_id_news int 

    BEGIN TRY 
     insert into news (title, text, year, month, day, id_writer) 
     values(@title, @text, @year, @month, @day, @id_writer) 

     set @last_id_news = SCOPE_IDENTITY() 

     if(@id_subject1 <> null) 
     begin 
      insert into news_subject (id_news, id_subject) 
      values (@last_id_news, @id_subject1) 
     end 

     if(@id_subject2 <> null) 
     begin 
     insert into news_subject (id_news, id_subject) 
     values (@last_id_news, @id_subject2) 
     end 

     if(@id_subject3 <> null) 
     begin 
     insert into news_subject (id_news, id_subject) 
     values (@last_id_news, @id_subject3) 
     end 

if(@id_subject4<>null) 
begin 
    insert into news_subject (id_news,id_subject) values (@last_id_news,@id_subject4) 
end 
if(@id_subject5<>null) 
begin 
    insert into news_subject (id_news,id_subject) values (@last_id_news,@id_subject5) 
end 

    COMMIT TRANSACTION; 
END TRY 
BEGIN CATCH 

ROLLBACK TRANSACTION; 
END CATCH; 

RETURN 

왜 작동하지 않습니까?

+0

'null'대신 'DBNull.Value'를 사용하십시오 (물론 C# 코드 내부). –

+0

SP가 무엇을 반환하는지 알려주십시오. 아마도 예외일까요? –

+2

'NULL'에 대해 평등 또는 비항 등 연산자를 사용할 수 없습니다. 이것은 ** 작동하지 않습니다 ** : if (@ id_subject4 <> null)'. 대신'IS NULL' 또는'IS NOT NULL'을 확인해야합니다. 따라서 모든 검사를 다음과 같이 바꾸십시오 : IF (@ id_subject4 IS NOT NULL) ..... –

답변

1
이미 의견과 답변에서 언급

, DBNull 여기 귀찮은 요구가에 DBNull.Value

비슷한 질문을 찾고 있습니다; 당신은하지만, 그것은 매우 읽을 수 있도록하기 위해 널 병합 연산자를 사용할 수 있습니다 :

new SqlParameter ("@id_subject1",((object)subject[0]) ?? DBNull.Value), 
    new SqlParameter ("@id_subject2",((object)subject[1]) ?? DBNull.Value), 
    new SqlParameter ("@id_subject3",((object)subject[2]) ?? DBNull.Value), 
    new SqlParameter ("@id_subject4",((object)subject[3]) ?? DBNull.Value), 
    new SqlParameter ("@id_subject5",((object)subject[4]) ?? DBNull.Value), 

또는 더 나은 : 아마도 당신의 ExecuteNonQuery 방법은 매개 변수를 통해 루프는 경우 DBNull.Value로 대체, .Value == null 여부를 확인할 수 있습니다. 다음 적절하게 처리 널 (null)와 완벽하게 매개 변수화

connection.Execute("AddNewNews", new { 
    title = news.Title, 
    //... 
    id_writer = news.Id_writer, 
    id_subject1 = subject[0], 
    //... 
    id_subject5 = subject[4], 
}, commandType: CommandType.StoredProcedure); 

:

은 또한 선택적으로 편리하게 당신을 위해 모든 것을 할 것 "단정"같은 도구를 고려한다.

+0

나는 이것을 수행하고이 오류를 보내지 않습니다. 아니요. 개체 유형 Subject에서 알려진 관리되는 공급자 네이티브 형식으로 매핑이 존재합니다. – nimaSadeghpour

관련 문제