2016-01-30 64 views
0

我試圖根據產品ID從我的Access數據庫中提取產品的價格。但是,嘗試執行此操作時遇到System.InvalidCastException錯誤。在Visual Studio中使用C#指定的強制轉換無效錯誤

下面是我的代碼段它源於錯誤:

protected void btnBuy_Click(object sender, EventArgs e) 
    string strProductId, strSQLSelect, strSQL; 
    decimal decUnitPrice; 

    strSQLSelect = "SELECT PromotionPrice FROM Products WHERE ProductId = @ProductID"; 
    cmd = new OleDbCommand(strSQLSelect, mDB 
    cmd.Parameters.Add("@ProductId", OleDbType.VarChar).Value = strProductId; 
    object oUnitPrice = cmd.ExecuteScalar(); 
    decUnitPrice = (decimal)oUnitPrice; //<-- Error code 

,這裏是堆棧跟蹤異常代碼:

[InvalidCastException: Specified cast is not valid.] 
    details.btnBuy_Click(Object sender, EventArgs e) in c:\wesnpets\details.aspx.cs:60 
    System.Web.UI.WebControls.Button.OnClick(EventArgs e) +9690930 
    System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +108 
    System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +12 
    System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +15 
    System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +35 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3562 

Visual Studio中表示,最後一行是其中之一造成了錯誤。我已經檢查了我的所有代碼以及我的數據庫,相關字段的格式已正確設置爲Decimal。但是,我仍然無法找到解決此問題的方法。

那麼有什麼我可能錯過了?希望你能爲此提出一些可能的解決方案。謝謝!

+0

該字段在數據庫中可以爲空嗎? –

+0

你能顯示異常消息嗎? – enkryptor

回答

0

C#類型十進制代表一個128位數字,而數據庫中的十進制數字有點不同,可以表示不同的東西。您可能可以將數據庫小數點作爲字符串並使用Decimal.Parse()來獲取decUnitPRice。

0

我想三件事情可能發生:

  • PromotionalPrice列不是小數
  • 查詢返回任何行。
  • 的PromotionalPrice列是該行空

我會做如下處理是:

if (oUnitPrice == null || Convert.IsDbNull(oUnitPrice)) 
{ 
    // no nows or PromotionalPrice column is null 
} 
else 
{ 
    // if oUnitPrice is not decimal 
    // but it can be converted to decimal it will work 
    decUnitPrice = Convert.ToDecimal(oUnitPrice); 
} 

聲明:我的答案直接寫在上面的代碼,所以它可能不是編譯。

0

我的猜測是,該表達式的返回值僅僅是一個不同的(也許數字)類型,但因爲它的盒裝作爲object你不能使用數字轉換類型轉換(注意,鑄造intdecimal是一個完全不同的操作比鑄造objectdecimal)。例如:

object d = 1.2; var x =(十進制)d;

將失敗,但(decimal)(double)d將成功。

我建議你使用Convert.ToDecimal而不是鑄造,這將根據操作數的實際類型在這裏做正確的事情。

相關問題