2011-05-08 56 views
1

我想創建一個函數(C#):C#:從函數返回dbnull.value或system.type?

int PutInt (int? x) 
{ 
    if (x.HasValue) 
     return x.Value; 
    else 
     return DBNull.Value; 
} 

但沒有從int到DBNull.Value演員。 有什麼辦法可以創建這樣的功能?

+1

你到底想幹什麼?這與數據庫有什麼關係? – BoltClock 2011-05-08 12:27:04

+0

我只想把int \ dbnull放到數據庫中,並用小算法構建函數,選擇我需要在數據庫中放入的數據) – dilix 2011-05-08 12:41:12

+0

也許你有設計問題。爲什麼名爲* PutInt *的方法實際返回一個int? – Juliet 2011-05-08 14:28:29

回答

2

讓我們假設你的DBMS是SQLServer的,你可以將你的函數

object PutInt (int? x) 
{ 
    if (x.HasValue) 
     return (object)x.Value; 
    else 
     return (object)DBNull.Value; 
} 

因爲SQLParamater值屬性假定類型的對象。希望我回答你的問題。

+1

'return x ?? (object)DBNull.Value;'? – Andrey 2011-05-08 12:49:42

3

這本質上是不可能的—值類型不能爲空。

您需要使用可爲空的類型(int?),這會使您的函數完全無用。

+0

即使你使用'int?',我仍然認爲它不會工作,因爲'DBNull'不是'int?'類型 – 2011-05-08 12:28:00

+0

@Fadrian:正確。 – SLaks 2011-05-08 12:29:22

1

不,你不能投intDBNull.Value。這用於評估數據庫字段的內容,而不是可空類型的內容。可爲空的類型的值將簡單地爲null

比您定義的函數更好的選項是使用null coalescing operator??)。

它與您試圖在函數中構建的邏輯非常相似。考慮下面的代碼行:

// Declare a nullable int, and set it to null 
int? x = null; 

// Assign int y to x, unless x is null, in which case, set y = -1 
int y = x ?? -1; 

// The variable y now has a value of -1 
Console.WriteLine(y); 
+0

現在我再次看到這個問題,我認爲你很清楚他想要什麼。 – BoltClock 2011-05-08 12:30:43

+0

@Bolt:那麼爲什麼它可能會被低估的任何理論呢?最近我還沒有做出如此出色的閱讀思考者的想法。爲我付出很多代價... – 2011-05-08 12:43:28

+0

Bah。看起來我們都搞砸了。 – BoltClock 2011-05-08 12:45:59

1

如果你是剛分配到對象變量的類型,我建議你只是忘記了使用方法,只是使用有條件分配

object obj = (x.HasValue? x.Value : DBNull.Value); 
+1

這可以重寫爲'x? DBNull.Value'。更漂亮了吧? – Andrey 2011-05-08 12:32:25

+0

不,你不能,看到我的評論下面的SLaks。 – 2011-05-08 12:34:27

+0

我剛剛開啓了VS並嘗試一下,證明你不能。如果你嘗試使用??,你會得到一個編譯錯誤「運營商」??不能應用於類型'int'和'System.DBNull'的操作數「 – 2011-05-08 12:35:57