DataTable 计算对象到十进制

DataTable Compute object to decimal

我正在尝试通过将 Compute 函数与 DataTable 结合使用来获取小数值。我需要 verNumber 列的最大值,它 总是 是一个整数 (1,2,3)或一位小数(1.11.22.33.1 等),但也可以像 1.1.14.1.2 这样结束.它永远不会是 1.02.11 之类的东西。考虑文档版本号。

不需要对这些数字进行计算,它们只是传递给当前接受字符串(但可以轻松更改)的函数,因此包含最大值的字符串应该可以工作,尽管作为概念证明我试图让它与 22.1 这样的数字一起工作。来自 (GetVersionsTable() method) 的数据库 table 的数据类型是 int,如果重要的话。

如果我尝试将此代码与小数一起使用,它会抱怨这是一个无效的转换。使用 int 有效,但显然会删除小数位(如果存在)。

System.Data.DataTable dt = doc.GetVersionsTable(true) as System.Data.DataTable;
decimal maxVal = (decimal) dt.Compute( "MAX(verNumber)", string.Empty );

结果 specified cast not valid

我也试过使用 decimal.Parse 也有类似的抱怨。

我试过直接获取一个字符串;

string maxVal = (string) dt.Compute( "MAX(verNumber)", string.Empty );

这给了我 Unable to cast object type of System.Int32 to type System.String,这表明它是一个 int,但为什么我不能将它转换为小数?

请注意,虽然我很想使用 Linq 来解决这个问题,但我不能,因为我没有 linq 支持。

我想 verNumber 是字符串(1.1.1 既不是 int 也不是 decimal)请 post 一些最小的复制代码。我试过下面的代码 - 它工作正常。

DataTable dt = new DataTable();
dt.Clear(); 
dt.Columns.Add("verNumber");
object[] o = { "1.2.1" };
dt.Rows.Add(new object[] { "1.1.1" });
dt.Rows.Add(new object[] { "1.4" });
dt.Rows.Add(new object[] { "2" });
dt.Rows.Add(new object[] { "4.1.4" });
string maxVal = (string)dt.Compute( "MAX(verNumber)", string.Empty);
Console.WriteLine(maxVal);