2010-08-06 6 views
7

정의했습니다 클래스 사람 속성 생일으로 nullable DateTime?, 다음 예제에서 null 통합 연산자가 작동하지 않아야하는 이유는 무엇입니까?C# ?? null 통합 연산자 질문

cmd.Parameters.Add(new SqlParameter("@Birthday", 
    SqlDbType.SmallDateTime)).Value =  
    person.Birthday ?? DBNull.Value; 

컴파일러 오류가 발생했습니다. "연산자 '?? 'System.DateTime'유형의 피연산자에 적용 할 수 없습니다. 및 'System.DBNull' "

또한 컴파일 오류가있어 다음 : 리팩터링 추천하고, 컴파일하지만, 제대로 작동하지 않았다으로

cmd.Parameters.Add(new SqlParameter("@Birthday", 
    SqlDbType.SmallDateTime)).Value = 
    (person.Birthday == null) ? person.Birthday:DBNull.Value; 

내가 (객체)에 캐스트를 추가하고 이 값은 두 경우 모두 sqlserver db에 null로 저장되었습니다.

SqlDbType.SmallDateTime)).Value =  
     person.Birthday ?? (object)DBNull.Value; 

누군가 무슨 일이 일어나고 있는지 설명 할 수 있습니까?

if (person.Birthday == null) 
    cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value 
     = DBNull.Value; 
    else cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value = 
      person.Birthday; 
+3

복제본 : http://stackoverflow.com/questions/218808/c-ado-net-nulls-and-dbnull-is-there-more-efficient-syntax – sgriffinusa

+0

다른 게시물에서 가져 오기 : SqlDbType.SmallDateTime)). 값 = person.Birthday ?? (객체) DBNull.Value; 감사! –

답변

20

문제는 당신이 그들에 널 병합 연산자를 사용할 수 있도록 DateTime?DBNull.Value 동일한 유형 아니라는 것이다 :

나는 다음과 같은 서투른 코드를 사용하는 데 필요한. 귀하의 경우에는

당신은 첫 번째 문제는 ?? 또는 ?: 운영자, 하나의 선택의 객체가 같은 유형이어야한다는 것입니다

3

Add()에 통해 유형 object의 값을 전달 person.Birthday ?? (object)DBNull.Value 할 수 있습니다. 여기 그들은 다른 유형입니다.

+1

그래서'? :'무엇을합니까? 편집 : 신경 끄시 고, 나는 그걸 알았어, 그 두 상징이 그 전에 같이 조립 된 것을 보지 못했다. http://msdn.microsoft.com/en-us/library/ty67wk28.aspx –

3

나는 예를 들어, 단지 적절한 DBNull이 null로의 모든 인스턴스를 변경, 쿼리를 실행하기 전에 내 매개 변수를 반복하는 것을 선호 :

foreach (IDataParameter param in cmd.Parameters) 
    if (param.Value == null) 
     param.Value = DBNull.Value; 

이 나를있는 그대로 null 값을 떠나 단순히를 교환 할 수 있습니다 나중에 한꺼번에 밖으로.

+0

나에게 이것은 깨끗하고 간단하며 좋은 대답이다. –

+0

이 문제는 사실 이후에 매개 변수를 반복 할 때 발생하는 추가 오버 헤드가 아니라 즉시 처리하는 것입니다. – Andrew