2011-03-11 6 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 +"' "))); ?? 그리고 웹 사이트를 더 내려 가면 user_id가 필요합니까? – Yorian

+0

TryParse를 읽어보십시오. 문자열 값과 '공백'변수를 지정합니다. 문자열을 int로 구문 분석 할 수 있으면 TryParse는 true를 반환하고 두 번째 인수에 입력 한 변수에 값을 넣습니다. 그렇지 않으면 false를 반환하고 응용 프로그램에서 오류로 처리 할 수 ​​있습니다. 나중에 코드에서 사용자 ID를 사용하려면 TryParse에 전달한 변수를 참조하십시오. – mdm

+0

TryParse를 구현하기 전에 먼저 구문 분석이 실패하는 이유를 알아내는 것이 좋습니다. – PHeiberg

2

대개 ID 열의 유형이 변경되어 값이 int에 맞지 않습니다. 또는 항상 int보다 큰 유형이지만 int에 들어 가지 않도록 크기가 너무 커졌습니다.

데이터베이스의 ID가 여전히 숫자이지만 너무 크면 속성과 캐스트를 int에서 큰 것으로 (예 : long) 부딪혀 문제가 해결됩니다.

+0

2000 년이 넘지 않은 가장 큰 번호 이후로는 이것이 실제로 문제가되지 않는다고 생각합니다. – Yorian

+0

이것은 나를 위해 일했습니다. . RoleId 열을 nvarchar로 설정했는데 int가되어야했습니다. – TheNameHobbs

1

ExecuteScalar은 정수가 아닌 값을 반환합니다. 응용 프로그램을 디버그하고 SqlHelper.ExecuteScalar 메서드로 23 행에서 반환되는 내용을 확인하십시오.

편집 :

반환 된 값은 당신이 그 유형에 대한 올바른 변환/캐스트를 사용하여 확인해야하는 int보다 또 다른 유형 인 경우. 값이 null 인 경우 응용 프로그램 데이터/논리에 오류가있어 SQL 문에서 반환되는 행이 없습니다. 데이터가 일관성이 있는지 확인하거나 null 케이스를 고려하여 로직을 변경해야합니다.

여전히 잘못된 것을 파악할 수 없으면 DB를 향해 수동으로 쿼리를 실행하고 반환되는 내용을 확인하십시오.

관련 문제