2017-02-15 96 views
2

我有一個數據庫字段爲int。 當我試試這個:從DataRow中獲取int值而不轉換爲字符串

int val = Convert.ToInt32(row["Int_Field_Name"].ToString()); 

它的工作原理。

但是,這看起來非常糟糕和無效。

我嘗試這些:

int val = row.Field<int>("Int_Field_Name"); 
int val = (int)row["Int_Field_Name"]; 

但他們拋出一個異常: 指定的轉換是無效

是否有一個更優雅,更有效的方法是什麼?

+1

'Convert.ToInt32(row [「Int_Field_Name」])'? –

+0

你是什麼意思?「但這看起來非常糟糕和無效。」? – A3006

+0

我的意思是,它沒有任何意義,先將其轉換爲字符串,它看起來很混亂。 –

回答

2

的問題是,大多數ADO類,如DataTable的是弱類型,所以你可以直接從提取他們是object。原因是底層提供商決定數據類型是什麼。例如,當您的基礎數據是從一些數據庫來了,你所期望的是一個int,實際上可以是一個shortuintulonglong,甚至DBNull.Value值。因此,您需要使用Convert.To*方法系列來完全安全。

但是在大多數情況下你不必做的一件事就是致電ToString。如果轉換函數是可轉換的,轉換函數將很好地轉換這些值。通過兌換,我的意思是他們將失敗,例如,如果您嘗試將大於int.MaxValuelong的值轉換爲int

所以最好的辦法是使用

Convert.ToInt32(row["Int_Field_Name"]) 

如果你覺得這個醜陋的(我做了一下也行),你可以引入擴展方法,像

public static int GetInt(this DataRow row, string fieldName) { 
    return Convert.ToInt32(row[fieldName]); 
} 

,並使用它像myRow.GetInt("Int_Field_Name")。當然,你可以通過一些檢查和可能的後備值來使這個擴展更健壯。

+0

感謝您提供清晰且解釋良好的答案。 –

1

嘗試:

int q = Convert.ToInt32(row["Int_Field_Name"]); 

也有ToInt16和64,取決於你需要什麼