“指定的强制转换无效”转换ExecuteScalar的结果

时间:2012-06-18 19:45:56

标签: c# asp.net

我正在尝试为项目编写代码,但无效的特定强制转换错误不断出现。任何人都可以帮助我,因为我很难过。提前谢谢。

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

5 个答案:

答案 0 :(得分:4)

第41行:显然oQty无法投放到Int32。试试

int intQuantityOnHand = Convert.ToInt32(oQty);

答案 1 :(得分:0)

我认为错误在第41行。在第41行放置一个断点,看看oQty的值是多少。它可能是空的。

答案 2 :(得分:0)

如果结果集为空,则应进行空检查。

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

那,或默认你的价值......

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

根据MSDN,ExecuteScalar返回

  

[t]结果集中第一行的第一列,或者为null   如果结果集为空,则为引用(在Visual Basic中为Nothing)。   最多返回2033个字符。

答案 3 :(得分:0)

试试这个:

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

然后检查if(intQuantityOnHand !=null)

答案 4 :(得分: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之类的方法,它们返回正确类型的数据;你不需要施放,解析或其他任何东西。