2016-07-07 3 views
1

내가 몇 가지 필드 테이블이 널 (null), 그 중 하나는 ADO 및 SqlDataReader 개체를 사용 할 수가 null 값을 포함하는 두 유형 필드 ...복구 double's이

나는 변수에 해당 필드를 복구 할 수 있습니다. 이 변수를 다음과 같이 정의했습니다 : Double, Double?, double, double? ... 그리고 GetValue (및 캐스트를 수행)을 사용하거나 GetDouble을 사용하여 값이 (SQLDataReader에서오고 있습니다.) 값이 null 인 경우 각각 충돌이 발생합니다.

이 변수가이 변수를 객체로 정의하는 것이 작동하지만 이것이 필요하지 않습니다. 미리 생각하는 것은 어려움이 ... 내 프로젝트에

견적이 유형을 처리 할 수있다 :이 값이 0 또는 null 일 때의 경우를 구별해야 ...

어떤 생각들?

편집 :

Object.DoubleValue= (Double?)Datos.GetDouble(1); 
Object.doubleValue= (double?)Datos.GetDouble(1); 

작동하지 않습니다.

Object.ObjectValue= Datos.GetValue(1); 

작업 중.

+0

코드를 공유해주십시오. –

+1

'GetDouble'을 사용하기 전에'IsDbNull' *을 호출하거나 Dapper와 같은 마이크로 ORM을 사용하여이 모든 것을 추상화하십시오. double 대신'numeric'과'GetDecimal'을 사용해야합니다 –

+0

데이터베이스의 데이터 유형은 무엇입니까? SQL 서버? – gsharp

답변

3

불행히도 상자 방법은 없습니다. 그러나이 같은 확장 방법을 조정할 수 :

(귀하의 경우 작동의 단지 거친 프로토 타입을 알고 있지만, 아마도 몇 가지 검사와 제약 등이 필요) 코드에서 다음

public static class Helpers 
{ 
    public static T GetSmartValue<T>(this SqlDataReader r, int ordinal) 
    { 
     dynamic value = r.GetValue(ordinal); 
     if (value == DBNull.Value) 
     { 
      value = null; 
      return value; 
     } 

     return (T) value; 
    } 
} 

var x = yourReader.GetSmartValue<double?>(1); 
+0

마지막으로 나는 desist ... 나는 당신의 방법 gsharp를 사용합니다. 꽤 우아한 ... 감사합니다 ... –

+0

환영합니다. 그러나 나는 당신이 어떤 종류의 응용 프로그램을 작성하는지 모르겠지만, 빠른 n 개의 더러운 것들만을위한 보통의 ado.net을 사용합니다. 다른 것들은 dapper 나 EF에 의존합니다. 인생을 더 편하게 해줍니다. – gsharp

+0

설명하기가 어렵지만 사용하고 싶습니다 ... gsharp에게 다시 감사드립니다 ... :) –