2011-03-11 94 views
0

此刻,我正在嘗試保持某個站點(asp.net)足夠長的時間,以便將其替換爲在php中構建。但是我對.NET或者asp.net不太瞭解。指定的演員表無效

我們收到此錯誤:

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 21:      string conn = ConfigurationSettings.AppSettings["DSN"]; 
Line 22:      string email = (Membership.GetUser(HttpContext.Current.User.Identity.Name)).Email; 
Line 23:      iD = (int)SqlHelper.ExecuteScalar(
Line 24:       conn, 
Line 25:       CommandType.Text, 


Source File: e:\PKwebSX\app_code\PKMembershipProvider.cs Line: 23 

Stack Trace: 

[InvalidCastException: Specified cast is not valid.] 
    PKMembershipProvider.get_ID() in e:\PKwebSX\app_code\PKMembershipProvider.cs:23 
    ASP.mijnpk_ascx.Page_Load(Object sender, EventArgs e) in e:\PKwebSX\mijnpk.ascx:20 
    System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15 
    System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +36 
    System.Web.UI.Control.OnLoad(EventArgs e) +102 
    System.Web.UI.Control.LoadRecursive() +47 
    System.Web.UI.Control.LoadRecursive() +131 
    System.Web.UI.Control.LoadRecursive() +131 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1064 


Version Information: Microsoft .NET Framework Version:2.0.50215.44; ASP.NET Version:2.0.50215.44 

它看起來像有鑄造從數據庫或什麼結果的問題。使用的代碼:

public sealed class PKMembershipProvider : SqlMembershipProvider 
{ 
    public int ID 
    { 
     get 
     { 
      int iD = 0; 
      if (HttpContext.Current.User.Identity.IsAuthenticated) 
      { 
       string conn = ConfigurationSettings.AppSettings["DSN"]; 
       string email = (Membership.GetUser(HttpContext.Current.User.Identity.Name)).Email; 
       iD = (int)SqlHelper.ExecuteScalar(
        conn, 
        CommandType.Text, 
        "SELECT ID From ledenlijst WHERE email = '" + email + "'"); 
      } 
      return iD; 
     } 
    } 
} 

有人可以告訴我這是哪裏出錯了嗎?

+2

代碼寫入的方式看起來總是會有一個有效的ID作爲SQL語句「SELECT ID from ledenlijst」的結果。如果沒有可能導致InvalidCastException的記錄被返回。另一個原因可能是ID是int以外的字段。這段代碼是否有時會工作,有時會失敗? – rsbarro 2011-03-11 11:22:11

回答

1

SQL查詢返回一個無法轉換爲int的ID(例如,中包含非數字字符的字符串,或根本沒有)。

iD = (int)SqlHelper.ExecuteScalar(
         conn, 
         CommandType.Text, 
         "SELECT ID From ledenlijst WHERE email = '" + email + "'"); 

看一看的Int32.TryParse()方法,該方法試圖解析字符串爲整數,但不會拋出,如果它不能例外。

+0

因爲我的語法和整個.NET很糟糕,我將如何實現這樣的功能,如下所示:Int32.TryParse(SqlHelper.ExecuteScalar( conn, CommandType.Text, 「SELECT ID From ledenlijst WHERE email ='「+ email +」'「)); ??如果進一步在網站上下載user_id,會發生什麼情況? – Yorian 2011-03-11 11:24:06

+0

在TryParse上閱讀。你給它一個字符串值和一個'空白'變量。如果字符串可以被解析爲一個int,那麼TryParse將返回true,並將該值放入您在第二個參數中提供的變量中。如果不是,它只會返回false,並且可以將其作爲應用程序中的錯誤處理。要稍後在代碼中使用用戶ID,只需引用傳遞給TryParse的變量。 – mdm 2011-03-11 11:28:12

+0

在實現TryParse之前,最好先找出解析失敗的原因。 – PHeiberg 2011-03-11 11:38:50

2

最有可能的ID列的類型已更改,並且該值不適合int。或者它總是比int大的類型,但只是變得太大而不適合int。

如果數據庫中的ID仍然是數字,但太大,則將屬性和從int類型轉換爲更大類型(如long)應該可以解決問題。

+0

我認爲這個問題並不是真正的問題,因爲最大的數字id不超過2000 .. – Yorian 2011-03-11 11:26:26

+0

這對我有效。我把RoleId列設置爲nvarchar,它應該是int – TheNameHobbs 2016-02-17 22:47:28

1

ExecuteScalar返回的不是整數。調試應用程序並檢查第23行返回的SqlHelper.ExecuteScalar方法的內容。

編輯:

如果返回值是另一種類型的比INT,你必須確保你使用正確的轉換/施放該類型。如果該值爲空,則可能在應用程序數據/邏輯中存在一些錯誤,導致sql語句不返回行。你必須確保數據是一致的,或者改變邏輯來考慮空情況。

如果仍然無法弄清楚有什麼問題,請嘗試對數據庫手動執行查詢並檢查返回的內容。