2017-06-14 43 views
0

有沒有更好的方法來解析SqlDecimal從SqlDataReader比這個更重要?從sql讀取器解析可爲空的double值的更好的方法

class test { 
    public double? Qte { get; set; } 
} 

SqlDataReader reader = cmd.executeReader(); 
reader.Read(); 

test t = new test() { 
    Qte = (reader["DL_Qte"] == DBNull.Value) ? (double?)null : double.Parse(reader["DL_Qte"].ToString()) 
} 
+1

請告訴我'reader'?如果它是一個'SqlDataReader'你介紹它有一個['GetDouble'方法](https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getdouble(v = vs.110)的.aspx)? – Liam

+0

閱讀器是SqlDataReader – ebelair

+0

可能重複[如何獲得與SqlDataReader浮動值?](https://stackoverflow.com/questions/37344167/how-to-get-float-value-with-sqldatareader) – Liam

回答

3

這裏就是我想要做的方式:

double d = reader.GetFieldValue<double>(reader.GetOrdinal("DL_Qte")); 

GetFieldValue<T>僅僅是因爲.NET 4.5,所以你也可以這樣做:

double d = reader.GetDouble(reader.GetOrdinal("DL_Qte")); 

編輯:

要解決可空和數據庫問題空你有,你可以做這樣的事情:

int columnIndex = reader.GetOrdinal("DL_Qte"); 

double? d = !reader.IsDBNull(columnIndex) ? 
    reader.GetFieldValue<double>(columnIndex) : new double?(); 
+0

我得到一個System.InvalidCastException Qte可爲空(雙?) – ebelair

+0

然後使用'double?'而不是'double'。 –

+0

我得到System.Data.SqlTypes.SqlNullValueException這個方法不能被調用空值 – ebelair

1

如果它在數據庫中的小數或金錢,你爲什麼不將其存儲爲小數在你的模型?你也應該不解析decimalstring再到double,使用right method

class Test { 
    public decimal? Qte { get; set; } 
} 

...

int columnIndex = reader.GetOrdinal("DL_Qte"); 
decimal? qte = null; 
if(!reader.IsDBNull(columnIndex)) 
    qte = reader.GetDecimal(columnIndex); // <----- !!! 
Test t = new Test { Qte = qte };