c# ado.net : nulls 및 dbnull - 더 효율적인 구문이 있습니까?
문제
나는 가지고있다 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을 할 값을 설정하는 것입니다. 실행에 전화하기 전에 그 일을합니다.