2017-08-03 50 views
0

我试图通过使用Compute函数与DataTable得到一个十进制值。我需要的verNumber列,这将总是是一个整数(123)或一个地方(1.11.22.33.1等),一个小数,但也可以落得像1.1.1的最大值或4.1.2。它永远不会像1.02.11。考虑文档版本号。DataTable计算对象到十进制

这些数字不需要计算,它们只传递给当前接受字符串的函数(但可以很容易地更改),所以包含最大值的字符串应该可以工作,尽管作为概念验证I试图让它与22.1这样的数字一起工作。数据库表来自(GetVersionsTable() method)的数据类型是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。

+0

如果verNumber列类型为int,那么它只是不能容纳1.1(不是int),更不用说1.2.3这不是任何种类的数量。 –

+0

我的不好,还有一个标签栏,其中包含'1.1.2'类型的数字。我会看看我是否可以返回它,因为它是一个字符串,那么我可以使用它,用上面的代码来获取最大版本号 –

回答

0

我想verNumber是字符串(1.1.1既不是int也不是十进制)请发布一些最小的复制代码。我试过代码波纹管 - 它工作正常。

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);