문제

나는 가지고있다 DateTime? 내가 DbParameter. 나는 다음과 같은 매개 변수를 만들고 있습니다.

DbParameter datePrm = updateStmt.CreateParameter();
datePrm.ParameterName = "@change_date";

그리고 나는 DateTime?dataPrm.Value 설명하는 동안 null에스.

처음에는 영리하다고 생각했습니다.

datePrm.Value = nullableDate ?? DBNull.Value;

그러나 그것은 오류가 발생하지 않습니다

운영자 '??' 'System.dateTime?'유형의 피연산자에 적용 할 수 없습니다. 및 'System.dbnull'

따라서 두 번째 인수가 첫 번째 인수의 널리 잡을 수없는 버전 인 경우에만 효과가 있다고 생각합니다. 그래서 나는 다음을 위해 갔다.

datePrm.Value = nullableDate.HasValue ? nullableDate.Value : DBNull.Value;

그러나 그것은 작동하지 않습니다.

'System.dateTime'과 'System.dbnull'사이에 암시 적 변환이 없기 때문에 조건부 표현 유형을 결정할 수 없습니다.

그러나 나는 그런 유형들 사이에서 변환하고 싶지 않습니다!

지금까지 내가 일할 수있는 유일한 것은 다음과 같습니다.

if (nullableDate.HasValue)
  datePrm.Value = nullableDate.Value;
else
  datePrm.Value = DBNull.Value;

그것이 내가 이것을 쓸 수있는 유일한 방법입니까? Ternary Operator를 사용하여 일한 사람을 작동시킬 수있는 방법이 있습니까?

업데이트: 나는 왜 왜 그런지 알지 못한다 ?? 버전은 작동하지 않습니다. MSDN 말 :

?? 연산자는 왼쪽 피연산자가 NULL이 아닌 경우 왼쪽 피연산자를 반환합니다. 그렇지 않으면 오른쪽 피연산자를 반환합니다.

그것이 바로 내가 원하는 것입니다!

Update2 : 글쎄, 그것은 결국 분명했습니다.

datePrm.Value = nullableDate ?? (object)DBNull.Value;
도움이 되었습니까?

해결책

아,! @trebz보다 훨씬 더 효율적인 솔루션을 찾았습니다!

datePrm.Value = nullableDate ?? (object)DBNull.Value;

다른 팁

sqlserver를 사용하는 경우 System.Data.SqlTypes 네임 스페이스에는 성가신 유형 캐스팅을 피하는 일부 유틸리티 클래스가 포함되어 있습니다. 예를 들어 이것 대신 :

var val = (object) "abc" ?? DBNull.Value;

당신은 이것을 쓸 수 있습니다 :

var val = "abc" ?? SqlString.Null;

당신이 사용하면 효과가 있습니다

datePrm.Value = nullableDate.HasValue ? (object)nullableDate.Value : DBNull.Value;

C# 3.0을 사용하는 경우 확장 메소드를 만들어 쉽게 수행 할 수 있습니다.

public static class DBNullableExtensions
{
    public static object ToDBValue<T>(this Nullable<T> value) where T:struct
    { 
        return value.HasValue ? (object)value.Value : DBNull.Value;
    }
}


class Program
{
    static void Main(string[] args)
    {
        int? x = null;

        Console.WriteLine(  x.ToDBValue() == DBNull.Value );
    }
}

두 번째 시도의 오류는 Nullabledate.value 및 dbnull.Value가 다른 유형과 두 경우 모두 하나의 유형을 선택 해야하는 3 가지 유형을 선택해야한다고 생각합니다. 나는 이것을 테스트 할 환경이 없지만 이것이 당신에게 효과가 있다고 생각합니다.

datePrm.Value = nullableDate.HasValue ? (object)nullableDate.Value : (object)DBNull.Value;

내가하는 방식은 방금 통과하는 정적 유틸리티 클래스가 있고 매개 변수 값이 null인지 확인하고 dbnull을 할 값을 설정하는 것입니다. 실행에 전화하기 전에 그 일을합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top