2012-03-06 8 views
0

foreach 루프에서 결과 쿼리를 사용하는 동안 결과 형식을 가져 오는 데 다음 코드를 사용하고 있는데 예외가 throw됩니다. "형식 'System.Int64'의 개체를 ' System.String ' ". 코드에 오류가있는 곳을 안내해주십시오. 귀하의 dtDetailDataTableLinq 쿼리 반복 결과

var query = from detailRow in dtDetail.AsEnumerable() 
group detailRow by detailRow.Field<string>("Domain") into grouping 
select new 
{ 
    Domain = grouping.Key, 
    Impressions = grouping.Count(), 
    Clicks = 
    grouping.Sum(detailRow => int.Parse(detailRow.Field<string>("Clicks").ToString())), 
    url = grouping.First<DataRow>() 
}; 

foreach (var detailRowGroup in query) 
{ 
    console.wirteline(detailRowGroup.Domain + detailRowGroup.Impressions + detailRowGroup.Clicks + detailRowGroup.url); 

} 

답변

0

문제가 해결되어 코드에 실수가 두 번 있음을 알았습니다. 그랬어.
1. Int64 대신 String을 사용했습니다. 문자열을 Int64로 바꾸면 오류가 해결됩니다.
2. DBNULL의 경우 조건을 사용했습니다.
다음은 코드 라인입니다.

Clicks = grouping.Sum(detailRow => Int64.Parse(detailRow.IsNull("Clicks") ? "0" : detailRow.Field<Int64>("Clicks").ToString())), 

감사합니다. Steven and Steve Haigh.

1

은 당신이 String로 검색하는 동안 입력 Int64의 값을 포함 Click라는 이름의 열이 포함되어 있습니다. 이 말을하기 어렵다 데이터에 대해 모른 채

int.Parse(detailRow.Field<Int64>("Clicks").ToString()) 
+0

감사합니다. 스티븐, 그게 문제였습니다. 하지만 이제는 dbnull 값과 관련된 다른 문제가 있습니다. 시스템이 null 값을 구문 분석하려고 시도하는 동안 예외를 throw하지만 처리 방법을 모릅니다. –

+0

'detailRow.Field ("클릭")'(따라서'? '와 함께) 할 수 있습니다. – Steven

1

,하지만 난 당신의 클릭 수의 열은, 그래서 숫자라고 생각합니다 :

int.Parse(detailRow.Field<string>("Clicks").ToString()) 

변경 그것에 : 문제는 다음 줄에 type 매개 변수가 long (64 비트 정수)이 되길 원하십니까?

e.e.

detailRow.Field<long>("Clicks") 

어쩌면?

그렇다면 구문 분석을 피하기 위해 코드를 리팩터링 할 수 있습니다.