.NET 2.0 null 가능 유형이 버전 1에서 있었던 경우 처음부터 DBNull.Value가 필요하지 않습니까?.NET 2.0 null 가능 유형 및 데이터베이스 null musings
RDBMS의 null에는 .NET의 null이 없습니다. .NET 버전 1에 이미 nullable 유형이 있는지 여부와 관계없이 DBNull.Value가 여전히 필요합니다.
.NET 2.0 null 가능 유형이 버전 1에서 있었던 경우 처음부터 DBNull.Value가 필요하지 않습니까?.NET 2.0 null 가능 유형 및 데이터베이스 null musings
RDBMS의 null에는 .NET의 null이 없습니다. .NET 버전 1에 이미 nullable 유형이 있는지 여부와 관계없이 DBNull.Value가 여전히 필요합니다.
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에 유사한 확장 메서드를 구현하는 데 시간을 낭비했습니다.
null
및 DBNull.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.
.NET에서의 Null 가능 유형은 해당 변수를 실제로 null로 허용합니다. DBNull은 "다른 환경에서이 값은 null로 간주됩니다"라고 말할 수있는 방법입니다. 을 실제로으로 구분하는 방법이 필요하기 때문에 현재 런타임의 네이티브와 같이 널 (null) 또는 "네이티브 (native)"로 널 (null) 또는 널 (null) 또는 네이티브 (null)로 널을 사용할 수 있습니다.
사실, ADN.NET이 단순히 DBNull 대신 null을 반환 할 수없는 경우를 찾기가 어려울 것이라고 생각합니다. 돌이켜 보면 DBNull이 좋은 아이디어인지 아닌지는 논쟁의 여지가 있습니다. Nullable
@binarycoder 분명히 ADO.NET *은 null을 반환 할 수 있지만 훨씬 더 구체적인 것에 대해서는 우리의 사랑하는 null을 적합하게합니다. 유형과 값을 완전히 공유하는 하나의 환경과 같이 데이터베이스와 애플리케이션을 처리하면 어떤 이점이 있는지 확신 할 수 없습니다. –
+1 "다른 환경에서" – Hao
나는 이것에 정말로 동의하지 않습니다. .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를 반환해야합니다.
@ 댄 실제로 우리는 거의 같은 것을 말하고 있다고 생각합니다. –
우리입니다. 한 가지 유형의 null로 할 수는 있지만 현재 환경에는 여러 가지 이유가 있습니다. –
우수 사례. 재검사에서 –
은 nullable 타입이 버전 1에 있으면 DBNull.Value 대신 null을 반환하도록 SqlCommand를 디자인 할 수 있습니까? – Hao
@Hao : 내 사례에서 두 사례를 구분하는 방법은 무엇입니까? –