2009-03-20 10 views
3

.NET 2.0 null 가능 유형이 버전 1에서 있었던 경우 처음부터 DBNull.Value가 필요하지 않습니까?.NET 2.0 null 가능 유형 및 데이터베이스 null musings

RDBMS의 null에는 .NET의 null이 없습니다. .NET 버전 1에 이미 nullable 유형이 있는지 여부와 관계없이 DBNull.Value가 여전히 필요합니다.

답변

3

System.Data.DataSetExtensions.dll은 아무 것도 아니지만 nullable 값 유형을 사용할 수 있었던 경우 DBNull.Value가 존재하지 않을 것으로 추측합니다.

row.Field<int?>("foo"); // returns a nullable int set to null 
row.Field<int>("foo"); // throws an InvalidCastException 

이것은 물론, 아주 편리한는 C#과 결합 DBNull.Value로 설정 "foo는"열, 당신이 얻을이있는 DataRow를에 해당 라이브러리의 확장 방법을 사용

... ??연산자를 사용하면 데이터베이스 null 대신 기본값을 제공 할 수 있습니다. 개인적으로 IDataReader/IDataRecord에 유사한 확장 메서드를 구현하는 데 시간을 낭비했습니다.

6

nullDBNull.Value은 모든 .NET 버전에서 서로 다른 두 가지 항목입니다. 예를 들어

:

public string CustomerName(int Id) 
{ 
    SqlCommand cmd = 
     new SqlCommand("SELECT Name FROM Customer WHERE id = " + custId, conn); 

    object result = cmd.ExecuteScalar(); 

    if (result == null) 
     return "Customer not found"; 

    if (result == System.DBNull.Value) 
     return "Customer found but name is null"; 

    return (string) result; 
} 

Ref.

+1

우수 사례. 재검사에서 –

+0

은 nullable 타입이 버전 1에 있으면 DBNull.Value 대신 null을 반환하도록 SqlCommand를 디자인 할 수 있습니까? – Hao

+0

@Hao : 내 사례에서 두 사례를 구분하는 방법은 무엇입니까? –

7

.NET에서의 Null 가능 유형은 해당 변수를 실제로 null로 허용합니다. DBNull은 "다른 환경에서이 값은 null로 간주됩니다"라고 말할 수있는 방법입니다. 을 실제로으로 구분하는 방법이 필요하기 때문에 현재 런타임의 네이티브와 같이 널 (null) 또는 "네이티브 (native)"로 널 (null) 또는 널 (null) 또는 네이티브 (null)로 널을 사용할 수 있습니다.

+0

사실, ADN.NET이 단순히 DBNull 대신 null을 반환 할 수없는 경우를 찾기가 어려울 것이라고 생각합니다. 돌이켜 보면 DBNull이 좋은 아이디어인지 아닌지는 논쟁의 여지가 있습니다. Nullable 이 .NET 1.0에 있었던 경우 디자인에 영향을 미칠 수있는 방법을 추측 할 수 있습니다. –

+0

@binarycoder 분명히 ADO.NET *은 null을 반환 할 수 있지만 훨씬 더 구체적인 것에 대해서는 우리의 사랑하는 null을 적합하게합니다. 유형과 값을 완전히 공유하는 하나의 환경과 같이 데이터베이스와 애플리케이션을 처리하면 어떤 이점이 있는지 확신 할 수 없습니다. –

+0

+1 "다른 환경에서" – Hao

1

나는 이것에 정말로 동의하지 않습니다. .NET에서

nullable 형식은 문제의 변수가 실제로 null이 될 수 있습니다. DBNull은 " 다른 환경에서이 값은 null로 간주되는 "이라고 말할 수있는 방법입니다. 우리의 현재 런타임에 네이티브 이나 "기본적으로"널 (null), - - 우리가 을 필요로하기 때문에 방법이 사이에 실제로는 null를 구별 할 다른 시스템에서 널 우리는 nullable 형식으로 을 전달하고 DBNull이는 완전히 다른 목적을 제공합니다.

이 구분은 로컬 변수가 모두 데이터베이스에서 이미 가져 왔는지 여부를 알 수없는 경우에만 필요합니다. 변수가 데이터베이스에서 반입되었다는 것을 알고 있으면 null과 DBNull을 식별 할 수 있습니다.

그러나 차이점은 프로그래밍 언어에서 null이 null이 아니라고 null 값이 참임을 나타냅니다. 데이터베이스에서 null은 알 수없는 값과 비슷한 것을 나타냅니다. 따라서 null == null은 데이터베이스에서 false입니다. null은, 미지의 값이 다른 미지의 값과 동일한 경우, 그 값을 알 수 없기 때문에, 아무것도하지 않습니다. DBNull이 이런 식으로 구현되었는지 DBNull.Value == DBNull.Value가 false로 평가되는지 잘 모르겠습니다.

편집

난 그냥 테스트 및 exspected으로 DBNull이는 동작하지 않습니다. DBNull.Value == DBNull.Value는 true로 평가되지만 데이터베이스 null의 의미로 false를 반환해야합니다.

+0

@ 댄 실제로 우리는 거의 같은 것을 말하고 있다고 생각합니다. –

+0

우리입니다. 한 가지 유형의 null로 할 수는 있지만 현재 환경에는 여러 가지 이유가 있습니다. –