2011-03-11 137 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

コードの記述方法は、SQL文「SELECT ID from ledenlijst」の結果として、有効なIDが常に必要であるように見えます。 InvalidCastExceptionの原因となるレコードが返されない場合別の原因は、IDがint以外のフィールドである可能性があります。このコードは時々動作し、失敗することがありますか? – rsbarro

答えて

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 +"' ")); ??さらに、Webサイトをさらにダウンさせると、user_idが必要になります。 – Yorian

+0

TryParseを読んでください。あなたはそれに文字列値と '空白'変数を与えます。文字列をintとして解析できる場合は、TryParseはtrueを返し、2番目の引数で指定した変数に値が格納されます。そうでない場合は、falseを返すだけで、アプリケーションのエラーとして処理できます。後でコード内でユーザーIDを使用するには、TryParseに渡した変数を参照するだけです。 – mdm

+0

TryParseを実装する前に、解析が最初に失敗した理由を調べるとよいでしょう。 – PHeiberg

2

ほとんどの場合、ID列の型が変更され、値がintに収まらない可能性があります。または、int型よりも大きな型のものでしたが、int型に収まるには大きすぎるだけでした。

データベースのIDがまだ数値であるが大きすぎる場合は、プロパティとキャストをintから大きな値(longなど)にバンプすると問題が解決するはずです。

+0

これは実際には2000年を超えない最大の番号のIDなのではないと思います。 – Yorian

+0

これは私のために働いた。 RoleId列がnvarcharとして設定されていて、intであるはずです – TheNameHobbs

1

ExecuteScalarは、整数ではないものを返しています。アプリケーションをデバッグし、SqlHelper.ExecuteScalarメソッドによって23行目に返される内容を確認してください。

編集:

返される値は、あなたがそのタイプの正しい変換/キャストを使用していることを確認する必要がint型よりも、別の型である場合。値がNULLの場合は、アプリケーション・データ/ロジックに何らかのエラーがあり、SQL文によって返される行がありません。データが一貫していることを確認するか、nullケースを考慮に入れてロジックを変更する必要があります。

何が間違っているのかわからない場合は、DBに対して手動でクエリを実行し、返される内容を確認してください。

関連する問題