2012-01-19 2 views
3

유효한 숫자 값으로 채워진 문자열 형식 열이있는 DataTable이 있고이 값의 합계를 가져와야합니다. 이 인스턴스에서 작업중인 데이터를 제어 할 수 있다면 "비용"을 저장하는 문자열 열을 사용하지 않았을 것이지만 그것은 불행한 현실입니다. 저는 "SUM (Convert ([Column], 'DataType'))"식과 필터가없는 DataTable.Compute 메서드를 사용했습니다. 문제는 다음 예외가 발생한다는 것입니다.SyntaxErrorException DataTable.Compute 메서드를 사용하여 변환 된 문자열 열의 합계를 가져옵니다.

System.Data.SyntaxErrorException - 집계 인수의 구문 오류 : 가능한 '하위'한정자를 사용하여 단일 열 인수가 필요합니다.

내가 가지고있는 문제를 성공적으로 재생하는 작은 코드 블록을 조합했습니다.

DataTable dt = new DataTable(); 
      dt.Columns.Add("Cost", typeof(string)); 
      dt.Rows.Add(new object[] { "1" }); 
      dt.Rows.Add(new object[] { "3.25" }); 
      dt.Rows.Add(new object[] { "0.75" }); 

      object TotalCost = dt.Compute("Sum(Convert(Cost,'System.Decimal'))", ""); 

마지막으로 참고, 그래서이 현재의 옵션이 아닌 통해 얻을 LINQ를 사용하여 .NET 2.0로 제한하고있다.

답변

2

이 문자열보다 번호를 저장하는 열 데이터 유형을 정의하는 것이 더 간단하지 않을까요?

DataTable dt = new DataTable(); 
dt.Columns.Add("Cost", typeof(System.Decimal)); 
dt.Rows.Add(1M); 
dt.Rows.Add(3.25M); 
dt.Rows.Add(0.75M); 

decimal TotalCost = (decimal)dt.Compute("Sum(Cost)", ""); 

편집 : 어떻게 제거 & 그것을 합산, 변환을 할 수있는 새 임시 열을 추가하는 방법에 대한?

DataTable dt = new DataTable(); 
dt.Columns.Add("Cost", typeof(string)); 
dt.Rows.Add(new object[] { "1" }); 
dt.Rows.Add(new object[] { "3.25" }); 
dt.Rows.Add(new object[] { "0.75" }); 

// temporary column for converting string to decimal 
dt.Columns.Add("CostNumeric", typeof(decimal), "Convert(Cost, 'System.Decimal')"); 
// using temporary column to do aggregation 
object TotalCost = dt.Compute("Sum(CostNumeric)", ""); 

dt.Columns.Remove("CostNumeric"); 
Console.WriteLine(TotalCost); 
+0

분명히! 그러나 제 질문에 언급했듯이 실제 프로그램에서 나와 전달되는 DataTable을 제어 할 수는 없습니다. 이 질문에 대해 작성한 코드 블록은 내가 다루고있는 것의 단순화 된 복제입니다. – Hagelt18

+1

@ Hagelt18 : 업데이트 된 답변보기 – shahkalpesh

+0

감사합니다 Shahkalpesh, 그게 멋지게 잘 될 것 같습니다. 비록 내가 그것을 사용하는 방법은 여기에 허용 대답 : 비록 예외를 던져 이상한 발견하지만 [링크] (http://stackoverflow.com/questions/708299/sum-datatable-columns-of-type-string). 우리는 결코 알지 못할지도 모른다, 하하. 도움 주셔서 감사합니다, 나는이 방법을 사용하여 끝날 것입니다! – Hagelt18

0

글쎄, 당신은 이런 식으로 작업을 수행 할 수 있습니다

decimal TotalCost = 0; 
foreach (DataRow row in dt.Rows) 
{ 
    //if you don't replace "." for "," the convert method will understand it as a miller points and will turn 3.25 in 325 
    TotalCost += Convert.ToDecimal(row["Cost"].ToString().Replace(".", ",")); 
} 
+0

응답 해 주셔서 감사합니다. 나는 그것에 의지하는 것을 고려해 봤지만 여러 열과 무수한 수의 행에 대해이 작업을 수행해야하므로보다 효율적인 것을 찾기 위해 노력하고 있습니다. 또한, 나는 밀러 포인트가 무엇인지 모르겠다. 나는 그것을봤을 때 나는 아무것도 발견하지 못했다 ...하지만 Convert.ToDecimal ("3.25")를 호출하면 제대로 3.25M을 반환한다. – Hagelt18

+0

흠, 알았어. 내가 너를 도울 수있는 걸 알아낼 수 있는지 알 겠어. – gabsferreira

관련 문제