2012-06-18 198 views
4

我在嘗試編寫項目代碼,但無效的特定轉換錯誤不斷出現。任何人都可以幫助我,因爲我難倒了。提前致謝。「指定的轉換無效」轉換ExecuteScalar的結果

Server Error in '/c#project' Application. 

Specified cast is not valid. 

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidCastException: Specified cast is not valid. 

Source Error: 


Line 39:   cmd.Parameters.Add("@ProductId", OleDbType.Char).Value = strProductId; 
Line 40:   object oQty = cmd.ExecuteScalar(); 
Line 41:   int intQuantityOnHand = (int)oQty; 
Line 42:   mDB.Close(); 
Line 43:   int intBuyQuantity = int.Parse(ddlQty.Items[ddlQty.SelectedIndex].ToString()); 

Source File: c:\Users\jacob\Desktop\c#project\ProductDetails.aspx.cs Line: 41 

Stack Trace: 


[InvalidCastException: Specified cast is not valid.] 
    ProductDetails.btnBuy_Click(Object sender, EventArgs e) in c:\Users\jacob\Desktop\c#project\ProductDetails.aspx.cs:41 
    System.Web.UI.WebControls.Button.OnClick(EventArgs e) +118 
    System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +112 
    System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10 
    System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 
    System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5563 

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.272 
+3

cmd.ExecuteScalar()返回什麼?你檢查過了嗎? – BlackVegetable

+1

我沒有看到任何錯誤的..嘗試int oQty = cmd.ExecuteScalar();那麼你不需要將其整理爲一個整數 – Thousand

+1

嘗試在第40行放置斷點並檢查ExecuteScalar之後的oQty。這可能是SQL異常拋出和oQty爲空?你能否也顯示命令文本? – Dimitri

回答

4

第41行:顯然oQty不能轉換爲Int32。嘗試

int intQuantityOnHand = Convert.ToInt32(oQty); 
+1

我很確定Convert.ToInt32將工作 – Dimitri

0

我相信錯誤是在第41行。把一個斷點在第41行,看看oQty的價值是什麼。它可能爲空。

0

如果結果集爲空,您應該有空檢查。

if(oQty!=null){ 
    int intQuantityOnHand = (int)oQty; 
} 

也就是說,或者拖欠你的價值......

int intQuantityOnHand = (oQty==null) ? 0 : (int)oQty; 

每MSDN,ExecuteScalar返回

[T]在結果集中,他的第一行的第一列,如果結果集爲空,則返回null 引用(在Visual Basic中爲Nothing)。 返回最多2033個字符。

0

試試這個:

object oQty = cmd.ExecuteScalar(); 
int? intQuantityOnHand = (oQty as int); 

,然後檢查if(intQuantityOnHand !=null)

0

ExecuteScalar回報The first column of the first row in the result set, or a null reference。這可能是任何事情;一個整數,null,一個字符串,varbinary。您必須檢查查詢的第一列的類型並將其分配給該類型的變量。

而且,你爲什麼這樣做:

int intBuyQuantity = int.Parse(ddlQty.Items[ddlQty.SelectedIndex].ToString()); 

你的東西,則字符串轉換爲字符串,爲整數。爲什麼?它是一個字符串嗎?那可以拋出異常。它是一個整數嗎?然後將其作爲整數讀取。您是否在使用System.Data.SqlClient?它包含如GetInt32這樣的方法,它們返回正確類型的數據;你不需要施放,解析或其他任何東西。