4

プロジェクトのコードを作成しようとしていますが、無効な特定のキャスト エラーが引き続き発生します。困っているので誰か助けてください。前もって感謝します。

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
4

5 に答える 5

4

41行目:どうやらoQtyにキャストすることはできませんInt32。試す

int intQuantityOnHand = Convert.ToInt32(oQty);
于 2012-06-18T19:52:44.403 に答える
0

エラーは41行目にあると思います。41行目にブレークポイントを設定して、oQtyの値を確認してください。nullの可能性があります。

于 2012-06-18T19:53:42.313 に答える
0

結果セットが空の場合に備えて、null チェックが必要です。

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

それ、またはデフォルトの値...

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

MSDN によると、ExecuteScalarが返されます

[t]結果セットの最初の行の最初の列、または結果セットが空の場合は null 参照 (Visual Basic では Nothing)。最大 2033 文字を返します。

于 2012-06-18T20:02:18.410 に答える
0

ExecuteScalar結果セットの最初の行の最初の列、または null参照。これは何でもかまいません。整数、null、文字列、varbinary。クエリの最初の列の型を調べて、その型の変数に割り当てる必要があります。

また、なぜこれを行うのですか:

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

何かを文字列に変換してから、文字列を整数に変換しています。なんで?文字列ですか?その後、例外がスローされる可能性があります。整数ですか?次に、整数として読み取ります。を使用していSystem.Data.SqlClientますか? GetInt32これには、適切な型のデータを返すようなメソッドが含まれています。キャスト、解析などは必要ありません。

于 2013-06-12T19:35:04.447 に答える
0

これを試して:

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

そしてチェックif(intQuantityOnHand !=null)

于 2012-06-18T22:58:17.027 に答える