2013-03-15 54 views
3

爲什麼將這項工作鑄造的ExecuteScalar()結果C#

int collectionCharge = (int)cmdCheck.ExecuteScalar(); 

但是這會產生一個異常

double collectionCharge = (double)cmdCheck.ExecuteScalar(); 

System.InvalidCastException:指定的轉換無效。

爲什麼它不是有效的?

編輯 我想簡單地從查詢返回一個單一的結果,即得到一些運費的價格。所以我不能把它變成int,因爲它必須有小數,因此試圖投到double。我仍然在學習asp.net所以如果有更好的方式來實現這一目標,請點我在正確的方向:)

EDIT 2 完整的代碼和SQL ...

using (SqlCommand cmdCheck = new SqlCommand("SELECT FREIGHT_PRICE FROM FREIGHT_QUOTER_BELNL_NEW WHERE CUSTOMER_NO = @CUSTOMER_NO AND COUNTRY = @COUNTRY AND ROUND(WEIGHT_FROM,0) < @WEIGHT AND ROUND(WEIGHT_TO,0) >= @WEIGHT AND SHIPVIA = '48';", connection)) 
       { 
        double collectionCharge = (double)cmdCheck.ExecuteScalar(); 
        FreightAmount = collectionCharge; 
       } 
+1

因爲它返回一個int,不返回一個double? – 2013-03-15 15:06:47

+1

我不知道,但雙重演員可能會讓你過去:'(double)(int)cmdCheck.ExecuteScalar()'。 – neontapir 2013-03-15 15:07:05

+0

'-1'ExecuteScalar不會返回'double' [MSDN Execute Scalar](http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlcommand.executescalar.aspx) – MethodMan 2013-03-15 15:09:39

回答

1

與感謝@DJKRAZE。

我將我的查詢更新爲SELECT CASE(FREIGHT_PRICE AS FLOAT),它現在與(雙)演員一起工作。

double collectionCharge = (double)cmdCheck.ExecuteScalar(); 
+1

這是不安全的例外。看到我對JaredPar的回答的評論。請看看這個解決方案:http://stackoverflow.com/questions/870697/unable-to-cast-object-of-type-system-dbnull-to-type-system-string/870771#870771 – asawyer 2013-03-15 15:40:34

+0

斯圖爾特我道歉沒有提供給你一個確切的例子,但給你的示例使用Scope_Identity作爲一個例子,導致你正確的解決方案.. +1爲了能夠得到這個工作的基礎上建議 – MethodMan 2013-03-15 16:01:04

+0

@asawyer,我同意你,然而在我的情況,它是安全的空值,因爲我們有一個NVL()在該視圖被查詢的字段,所以它永遠不會爲空(但0)。 – Stuart 2013-03-15 16:18:12

8

這裏的問題是,ExecuteScalar正在返回一個int,它被裝箱到object。爲了轉換爲double必須先拆箱到int然後轉換爲double

double collectionCharge = (double)(int)cmdCheck.ExecuteScalar(); 
+0

的對象。' – asawyer 2013-03-15 15:19:39

3

使用Convert.ToXXX可以避免無效的轉換異常。

IE

collectionCharge=Convert.ToDouble(cmdCheck.ExecuteScalar()); 

因爲它看起來的ExecuteScalar返回一個對象這樣的代碼:

double collectionCharge = (double)cmdCheck.ExecuteScalar(); 

也不能正常工作

-1

我會建議使用此代碼:

object o = c.ExecuteScalar(); 
    if (o != null) 
    { 
     int x = Int32.Parse(o.ToString());  
    } 

這有兩件事。首先它確保你的c.ExecuteScalar()沒有返回null如果它這樣做了,而你試圖施放,你就會遇到問題。其次,它使鑄造更簡單,因爲它可以應用於從查詢中讀取時幾乎所有的情況。

該對象變成一個字符串。如果你想要它作爲一個字符串,你就完成了。 如果您想將它作爲布爾值,請檢查該字符串。等於(「真」) 如果你想把它當作一個int,Int32.Parse(string); 如果你想讓它作爲一項長期的,Int64.Parse(string);

基本上,你會不會擔心完全理解超載/顯式轉換。

+0

將某些東西轉換爲字符串,以便將其轉換回數字?這看起來非常笨拙和緩慢。在我看來,根據我的經驗(PostgreSQL smallint可以簡寫爲short,但不能爲整數),並且從閱讀此線程可知,其中一種Convert方法是最佳解決方案。 – 2015-10-29 14:31:28