2016-07-07 13 views
1

我有一个表与几个领域,其中之一是可以包含空值Double类型字段......恢复double's空

使用ADO和SqlDataReader的我恢复的变量场。我将这个变量定义为:Double,Double?,double,double? ...我用GetValue(并做了一个演员)或使用GetDouble ...得到了值(来自SQLDataReader)...当值为空时,每一个都会崩溃。

唯一的这是工作是定义这个变量作为一个对象,但我不想要它。在超前的思维可能是艰难的时刻在我的项目处理这种类型的...

报价:我当这个值为0或空的区分的情况下...

任何想法的家伙?

编辑:

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

不工作。

Object.ObjectValue= Datos.GetValue(1); 

工作。

+0

你能分享一下你的代码吗? –

+1

在使用'GetDouble'之前调用'IsDbNull' * *或使用像Dapper这样的微ORM来抽象所有这些。你应该使用'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

最后我停下来......我会用你的方法gsharp。相当优雅...感谢搭档... –

+0

欢迎。但是我不知道你正在写什么样的应用程序,但我使用普通的ado.net大多只用于快速的肮脏的东西,对于其他我依赖于精巧或EF。使生活更容易:) – gsharp

+0

很难解释...但我需要使用它...再次感谢gsharp ... :) –