SyntaxErrorException с использованием метода DataTable.Compute для получения суммы преобразованного столбца строки - PullRequest
4 голосов
/ 19 января 2012

У меня есть DataTable, в котором есть столбец строкового типа, заполненный допустимыми числовыми значениями, и мне нужно получить сумму этих значений. Пожалуйста, поймите, что если бы я контролировал данные, с которыми я работаю в этом случае, я бы не использовал строковый столбец для хранения «стоимости», но это прискорбная реальность. Я использовал метод DataTable.Compute с выражением "SUM (Convert ([Column], 'DataType'))" "и без фильтра. Проблема в том, что я получаю следующее исключение:

System.Data.SyntaxErrorException - Синтаксическая ошибка в агрегированном аргументе: ожидание аргумента из одного столбца с возможным квалификатором 'Child'.

Я собрал небольшой блок кода, который успешно воспроизводит мою проблему.

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'))", "");

Последнее замечание, я ограничен .NET 2.0, поэтому использование LINQ для этого в настоящее время недоступно.

Ответы [ 2 ]

3 голосов
/ 19 января 2012

Не проще ли определить тип данных столбца для хранения номера, чем строка?

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 голосов
/ 19 января 2012

Ну, вы можете сделать это так:

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(".", ","));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...