2010-06-04 2 views
1

ASP.Net 앱의 데이터 계층은 저장된 proc를 호출하여 로그인시 방문객에 대한 작은 양의 정보를 가져옵니다. 나는 자신의 전화 번호와 sproc을 전달하고, 간단한 SELECT를 사용하여 5 개의 필드를 전달한다. 첫 번째 필드는 기본 키인 BIGINT이다. 내 데이터 레이어가 DataRow를 가져 와서 데이터 개체를 만들려고합니다. 데이터 개체에서 기본 키를 나타내는 속성은 Int64입니다. 즉 다음과 같습니다캐스팅 오류없이 DataRow의 형식화되지 않은 필드 unboxing

sub = new PersistentSubscriber((String) dr["UserFirstName"], 
     (String) dr["UserLastName"], 
     phoneNumber, (Int64) dr["UserId"], (Byte) dr["SubscriberStatus"]); 

가 내가 찾는거야 것은 내가 큰 기본 키 값을 가질 때 모든 것이 잘 작동한다는 것입니다 같은 88698.을 그러나, 나는 작은 하나를 얻을 때, 999처럼, 내가 얻을 해당 기본 키 속성을 설정하려고하면 "지정한 캐스트가 잘못되었습니다."오류가 발생합니다. 내가 잘못 여기서 뭐하는 거지, 형식화 된 데이터 집합에 의존하지 않고

?(Int64)dr["UserId"] 
Cannot unbox 'dr["UserId"]' as a 'long' 
?(int)dr["UserId"] 
999 
?(Int32)dr["UserId"] 
999 

: 내가 직접 실행 창에서 함께 연주 할 때,이 얻을?

+0

는 지금까지 변환이 변환처럼 호출 및 이동 TryParse, 나는이 문제가 해결됩니다 가정,하지만 난 "왜"나는 모든 것을 어떻게해야합니까 더 걱정? 999는 유효한 Int64와 마찬가지로 유효한 Int32입니다. 왜 내가 어떤 변환을해야합니까? 유형이 처리 할 수있는 것보다 크지 않을 것이라는 것을 알고 있다면, 나는 잘되어야합니다. –

답변

1

Int64.TryParse을 시도해보십시오.

long userId; 
if(Int64.TryParse(dr["UserId"], out userId)) 
{ 
    // successful conversion 
} 
2

나는이 오래된 질문을 파고 있어요 부여하지만, 왜 ...

당신이 DataSetExtensions 들어 본 적이 없습니다 상단에 구글 검색에서 나를 위해 나타났다? 이를 통해 강력한 형식의 방식으로 DataRow의 필드에 액세스 할 수 있습니다. 이것은 linq 쿼리에 매우 유용하며 내 경험상 DataTable.Select()를 호출하는 것보다 훨씬 빠릅니다.

System.Data.DataSetExtensions에 대한 참조를 프로젝트에 추가하면 바로 사용할 수 있습니다. 예에서

:

Int64 value = dr.Field<Int64>("UserId"); 

dr.SetField("UserId", value); 
관련 문제