내 XSD 데이터 세트에서 dbnull에서 부울 전환을 처리하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/445136

  •  22-07-2019
  •  | 
  •  

문제

내 데이터베이스에는 비트 (부울) 값인 테이블 중 하나에 몇 개의 열이 있습니다. 필드에 항상 데이터가 포함되지 않기 때문에 그들은 무효가 될 수 있습니다.

테이블을 사용하여 XSD 데이터 세트를 작성하는 프로세스를 거쳤으며 AllowDBNULL 필드가 True로 설정되었는지 확인했습니다.

그러나 구성된 getData 메소드를 사용하여 데이터베이스의 레코드를 데이터베이스로 가져 가면 다음 오류가 발생합니다.

[InvalidCastException: Conversion from type 'DBNull' to type 'Boolean' is not valid.]

열의 DefaultValue 필드 이외의 다른 것을 지정해야합니까, 아니면 다른 필드를 설정해야합니까?

이 프로젝트를 통해 여전히 개발 단계에 있으므로 필드를 숯으로 변경하고 Y/N/NULL 옵션을 사용하는 것이 선호되는 경우 그렇게하는 데 너무 불리하지 않습니다.

도움이 되었습니까?

해결책

IMHO 비트/부울 필드에서 널을 허용해서는 안됩니다.

Mike Hadlow는 여기에 좋은 게시물을 가지고 있습니다.

http://mikehadlow.blogspot.com/2006/10/nullability-voodoo.html

부울은 정의에 따라 이중 상태 유형입니다. 무효가되면 세 번째 상태를 추가하고 있습니다. 어느 시점에서 당신을 괴롭히기 위해 돌아올 것입니다.

다른 팁

나는 Iain에 동의하지 않아야합니다. 세 가지 값 논리는 2 값 논리만큼 실행 가능합니다. 식탁에있는 사람은 살아 있거나 죽었거나 그가 살아 있는지 죽었는지 알지 못합니다. Mike가 자신의 길을 가졌다면 여기에서 조금 사용할 수 없었습니다. 상태 테이블에 FK가 필요합니다. 1 = 살아있는, 2 = 죽음, 3 = 알 수 없습니다.

비트의 전체 목적은 공간을 절약하는 것입니다. 값을 t 또는 f, y 또는 n (또는 u)로 제한하는 제약 조건으로 항상 char (1)를 만들 수 있습니다.

그러나 나는 Iain이 Mike가 말하는 것을 잘못 해석하고 있다고 생각합니다. Mike는 Nulls 사용을 낙담하지 않으며, 결국 그는 프로세스가 완료 될 때까지 EndDate 열이 Null이라고 생각합니다. 그는 단지 신비한 속성을 가진 열에 널 가치를 부여하지 않는다고 말합니다. 프로세스가 특정 상태에 있는지 아는 열쇠 인 것처럼.

실제로 데이터베이스의 Nulls는 매우 유용한 부작용이 있습니다. Oracle (아마도 다른 데이터베이스)은 NULLS를 색인하지 않습니다. 따라서 하나의 값만 중요한 열이있는 경우 직원 목록이 있다고 말하는 것과 같이 제거하지 않고 IS_ACTIVE_EMPLOYEE 비트 열이 색인화되었습니다. 이 경우 기존 사업의 경우 현재 직원 수는 현재 직원 수보다 >>>입니다. 1%와 99% 0이 있다고 가정 해보십시오.

그 지수는 필요한 것보다 99 배 더 큽니다. 테이블의 1%이기 때문에 괜찮은 모든 1을 색인화하지만 해당 인덱스를 사용하여 절대 사용할 수없는 행에 0도로드됩니다. 당신이 모든 비활성 직원을 원한다면, 색인이 무시되고 FT가 수행됩니다. 따라서 1과 null은 데이터베이스 관점에서 훨씬 더 효율적입니다.

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