2016-07-07 70 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 ... :) –