DataTable.Compute可以进行聚合函数的操作,如sum(),但是在进行DataTable遇到如标题的错误:无效的聚合函数 Sum()和类型 String 的用法;原因是因为当前栏的数据类型是String,非数值型,所以报错了;- 不信你可以去数据库查看下该字段的类型;
解决方法有两个:
第一种: 直接去数据库修改表结构设计的类型,改成数值型,如我就是这么懒,直接将varchar类型改成了 float;--然后bug 就over了;
第二种:那就是后端在通过compute聚合函数计算时,提前转换成类型,改成数值,理论上也是可行的(就是我试过,但是后面没有实现效果,我就变成了第一种方法)
需要注意的是:修改类型将数据重新写入需要转换为对应类型才能写入。
/// <summary>
/// 修改数据表DataTable某一列的类型和记录值(正确步骤:1.克隆表结构,2.修改列类型,3.修改记录值,4.返回希望的结果)
/// </summary>
/// <param name="argDataTable">数据表DataTable</param>
/// <returns>数据表DataTable</returns>
private static DataTable UpdateDataTable(DataTable argDataTable)
{
DataTable dtResult = new DataTable();
//克隆表结构
dtResult = argDataTable.Clone();
// 如果你只是要修改数据类型 看这个就行
foreach (DataColumn col in dtResult.Columns)
{
if (col.ColumnName == "数量")
{
//修改列类型
col.DataType = typeof(int);
}
if (col.ColumnName == "日期")
{
//修改列类型
col.DataType = typeof(String);
}
}
//写入数据
foreach (DataRow row in argDataTable.Rows)
{
DataRow rowNew = dtResult.NewRow();
rowNew["姓名"] = row["姓名"];
//修改记录值
rowNew["日期"] = Convert.ToDateTime(row["日期"]).ToString("yyyy-MM-dd").ToString();
//修改记录值
rowNew["数量"] = GvNet.Cvt.ToInt16(row["数量"].ToString());
dtResult.Rows.Add(rowNew);
}
return dtResult;
}