[c#] null과 System.DBNull.Value의 차이점은 무엇입니까?

null과 System.DBNull.Value 사이에 차이점이 있습니까? 그렇다면 무엇입니까?

이제이 동작을 발견했습니다.

while (rdr.Read())
{
    if (rdr["Id"] != null) //if (rdr["Id"] != System.DBNull.Value)  
    {
        int x = Convert.ToInt32(rdr["Id"]);
    }
}

반환 값이 없지만 I는 SQL의 DataReader를 사용하여 데이터베이스에서 데이터를 검색하는 동안 if(rdr["Id"] != null)반환 true결국 정수로 널 캐스팅에 대한 예외 던졌다가.

그러나 이것은 내가 사용하면 if (rdr["Id"] != System.DBNull.Value)returns false.

null과 System.DBNull.Value의 차이점은 무엇입니까?



답변

글쎄, null어떤 유형의 인스턴스도 아닙니다. 오히려 잘못된 참조입니다.

그러나 System.DbNull.Value,의 인스턴스에 대한 유효한 참조이다 System.DbNull( System.DbNull싱글하고 System.DbNull.Value당신에게 그 클래스의 단일 인스턴스에 대한 참조 제공) 존재하지 않는 나타냅니다 *의 데이터베이스에 값을.

* 일반적으로라고 말하지만 null문제를 혼동하고 싶지는 않습니다.

따라서 둘 사이에는 큰 개념적 차이가 있습니다. 키워드 null가 잘못된 참조를 나타냅니다. 클래스 System.DbNull는 데이터베이스 필드에 존재하지 않는 값을 나타냅니다. 일반적으로 null두 개의 매우 다른 개념 (이 경우 데이터베이스 필드에 존재하지 않는 값 대 유효하지 않은 참조)을 나타 내기 위해 동일한 것을 사용하지 않도록해야합니다 (이 경우).

이것이 바로 많은 사람들 이 일반적으로 null 객체 패턴 을 사용하는 이유 System.DbNull입니다. 이것이 바로 그 예입니다.


답변

DBNull 클래스 의 문서에서 :

개체 지향 프로그래밍 언어의 null 개념을 DBNull 개체와 혼동하지 마십시오. 객체 지향 프로그래밍 언어에서 null은 객체에 대한 참조가 없음을 의미합니다. DBNull은 초기화되지 않은 변형 또는 존재하지 않는 데이터베이스 열을 나타냅니다.


답변

DBNull.Value는 처리해야하는 성가신 일입니다.

DBNull인지 확인한 다음 값을 반환하는 정적 메서드를 사용합니다.

SqlDataReader r = ...;
String firstName = getString(r[COL_Firstname]);

private static String getString(Object o) {
   if (o == DBNull.Value) return null;
   return (String) o;
}

또한 DataRow에 값을 삽입 할 때 “null”을 사용할 수 없으며 DBNull.Value를 사용해야합니다.

“null”의 두 가지 표현은 명백한 이점이없는 잘못된 설계입니다.


답변

DBNull.Value는 .NET 데이터베이스 공급자가 데이터베이스의 null 항목을 나타 내기 위해 반환하는 것입니다. DBNull.Value가 null이 아니고 데이터베이스 행에서 검색된 열 값에 대한 null 비교가 작동하지 않으므로 항상 DBNull.Value와 비교해야합니다.

http://msdn.microsoft.com/en-us/library/system.dbnull.value.aspx


답변

DataRow에는 IsNull()데이터베이스에 표시되는 null과 관련하여 null 값이있는 경우 열을 테스트하는 데 사용할 수있는 호출되는 메서드가 있습니다.

DataRow["col"]==null항상 될 것 false입니다.

사용하다

DataRow r;
if (r.IsNull("col")) ...

대신.


답변

Null은 C ++의 제로 포인터 와 유사합니다 . 따라서 어떤 값도 가리 키지 않는 참조입니다 .

DBNull.Value완전히 다르며 필드 값에 NULL이 포함 된 경우 반환 되는 상수 입니다.


답변