2009-09-04 45 views

回答

8

從DataRow中讀取時,最大的敵人是空值。在DataRow中,當值爲空時,它不等於空值:它等於DBNull.Value

if(DBNull.Value == null) 
{ 
    // Will never happen 
} 

除非您知道您的字段不能爲空,否則投射並不安全。例如,如果數據的DBNull下面的例子將失敗:

string name = (string)dr["Name"]; 

如果你可以使用LINQ的擴展,可以包括參考System.Data.DataSetExtensions和命名空間System.Data並調用

string name = dr.Field<string>("Name"); 

如果您不能使用LINQ,那麼你必須退回到檢查空值與

string name = null; 
if(!dr.IsNull("Name")) 
    name = (string)dr["Name"]; 

或者你可以像THI編寫自己的場函數S:

public static T GetValue<T>(object value) 
{ 
    if (value == null || value == DBNull.Value) 
     return default(T); 
    else 
     return (T)value; 
} 

,並得到你的價值是這樣的:

string name = GetValue<string>(dr["Name"]); 
+0

如果你調用int i = dr.Field (「someintcolumn」);該行是空的? – 2009-09-04 20:56:37

+0

字段()足夠明亮以返回默認值(T),因此如果數據爲空,則您的i變量將等於0。 – 2009-09-04 20:58:54

+1

+1爲徹底,並花時間來覆蓋空值。 – womp 2009-09-04 21:20:43

2

簡單鑄造的值,以正確的類型應該工作:

(string) dr["someString"]; 
(int?) dr["someInteger"]; 
(byte[]) dr["somedata"]; 
+1

警告,'(INT?)博士[ 「someInteger」];如果值是DBNull的'會失敗。 – 2009-09-04 20:29:48

+0

舉例說,調用int.Parse()有什麼好處嗎? – Gratzy 2009-09-04 20:36:09

+0

是否有獲取(int?)工作的捷徑。我在想像int?.TryParse(dr [「some」])? (int?)dr [「some」]:null – 2009-09-04 20:46:11

3

如果你可以使用.NET 3.5,那麼你可以使用Field extension method更容易地訪問數據,如果你知道的類型。一個例子是:

string somestring= row.Field<string>("SomeString"); 

否則你堅持鑄造領域的類型對象的老式方法。

+0

我卡住了。謝謝:) – 2009-09-04 20:42:44

0
string GetString(DataRow dr, string ColumnName) 
{ 
    if (dr.IsNull(ColumnName)) 
    { 
     return null; 
    } 
    return (string)dr[ColumnName]; 
} 
+0

在這裏返回一個空字符串而不是空值是否更有意義? – Mike 2009-09-04 21:43:43

+0

也許,但列值也可以有「」,所以你必須以某種方式區分。這取決於你喜歡/需要它。 – 2009-09-05 01:50:40

0

另一種選擇是使用 「爲」

string str = dr["someString"] as string; 

如果是DBNull.Value(或任何其他對象不是字符串類型),那麼str會得到一個真正的「null」。否則,它會得到正確的字符串值。

對於值類型,你可以使用可空,即

int? i = dr["someint"] as int?; 

再次,它會得到的,而不是DBNull.Value一個真正的「零」。然而,可空類型,你必須記得用.value的,即

int x = i.Value + 5; 
+0

int?我= 3; int x = i + 5;將無法工作?奇怪的!從來不知道。 – 2009-09-30 21:55:47

+0

甚至不會編譯 – JoelFan 2009-10-01 21:22:11

相關問題