2017-08-03 89 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);