2011-11-08 33 views
0

我想從SQL數據庫返回一個值。然而,每次我執行下面的方法時,我都會得到一個錯誤,指出「InvalidCastException未處理,對象無法從DBNull轉換爲其他類型。」從SQL數據庫返回單個值時出現C#InvalidCastException

你可以擺脫這種任何光將不勝感激。我正在使用的方法如下。

謝謝。

public static int ScrapTotal2(string prdTypeV, string startDateV, string prtCodeV) 
    { 
     int scrapTotal2; 

     SqlParameter prdType = new SqlParameter("@prdType", SqlDbType.VarChar); 
     prdType.Value = prdTypeV; 
     SqlParameter startDate = new SqlParameter("@startDate", SqlDbType.VarChar); 
     startDate.Value = startDateV; 
     SqlParameter prtCode = new SqlParameter("@prtCode", SqlDbType.VarChar); 
     prtCode.Value = prtCodeV; 

     SqlCommand scrapTotal2SC = new SqlCommand("SELECT SUM([QTY_SCRP]) FROM [TBL_PRDMST] WHERE [PRD_CODE] LIKE @prdType AND [PRD_DATE] = @startDate AND [PRT_CODE] LIKE @prtCode", DataAccess.myConnection); 
     scrapTotal2SC.Parameters.Add(prdType); 
     scrapTotal2SC.Parameters.Add(startDate); 
     scrapTotal2SC.Parameters.Add(prtCode); 

     DataAccess.myConnection.Open(); 
     scrapTotal2 = Convert.ToInt32(scrapTotal2SC.ExecuteScalar()); 
     DataAccess.myConnection.Close(); 

     return scrapTotal2; 
    } 
+0

做你的選擇返回NULL或一個有效的價值?首先檢查數據庫 – Pleun

+0

您是否有權訪問代碼並能夠進行調試?如果你能告訴我們哪一行拋出一個異常,那會很好。將你的方法代碼封裝在try-catch中,你會得到有用的信息。 – AksharRoop

回答

3

您的SELECT語句返回NULL值。你必須檢查它是否是空第一:

object result = scrapTotal2SC.ExecuteScalar(); 
if (result == DBNull.Value) 
{ 
    /* write your code */ 
} 
else 
{ 
    scrapTotal2 = Convert.ToInt32(result); 
} 
+0

謝謝。我錯誤地認爲總和應該是0而不是零。這很好。 – fanle

0

好像錯誤信息是明確的 - 你的查詢返回null(在.NET將是一個DbNull)。

這不能轉換爲Int32,因爲整數是值類型,不能是null

請檢查DbNull的返回值並從數據層返回默認值,或者檢查您的查詢和數據庫以確保不會返回null

+0

但convert.toInt32確實將null轉換爲0 ... –

+1

@RoyiNamir - 但它不會將'DbNull'轉換爲'0'。 'DbNull!= null'。 – Oded

+0

@RoyiNamir - 是的,它將'null'轉換爲0,但不是'DbNull'。 – Polynomial

0

某些SQL Server認爲空單的那筆爲空,而不是0。所以你必須處理從零轉換爲int自己。不直接將查詢結果轉換爲int。

0

嘗試scrapTotal2 = Convert.ToInt32(((string)scrapTotal2SC.ExecuteScalar()));

1

既然你沒有指定,我會認爲這條線就是問題所在:

scrapTotal2 = Convert.ToInt32(scrapTotal2SC.ExecuteScalar()); 

當你在數據庫中的NULL,它將被投到代碼中的一種DBNull。此類型不能投射到Int32

您可以檢查它像這樣:

var obj = scrapTotal2SC.ExecuteScalar() 
if (obj == DBNull.Value) 
{ 
    // whatever logic you want to handle nulls 
} else { 
    scrapTotal2 = Convert.ToInt32(obj); 
} 
+0

抱歉,忘記說明哪一行發生了問題。謝謝您的幫助。 – fanle

0

錯誤消息是因爲返回值是NULL和您試圖在INT類型變量來存儲......這不能做。

也許你可以做的是...

if(retval is null) then assign var = 0. 
+0

DBNull與null不同,OP必須檢查retval == DBNull。值 –

+0

實際上,我的意思是相同的,但不能收集語法,因此寫在psudeo代碼中。 – Rahul

相關問題