2010-08-24 18 views
2

我正在嘗試編寫一個通用函數來檢查每個數據庫參數以查看它是否爲null,如果是,則返回DBNull;如果沒有,則返回該對象。用於檢查值爲空的VB.NET通用函數

因此,這裏是我的功能:

Public Shared Function CheckForNull(ByVal obj As Object) As Object 
    If obj <> Nothing Then Return obj Else Return DBNull.Value 
End Function 

我的問題是,一些我傳遞給函數的對象都是空。所以我可能會傳遞一個Long函數?或Int ?,但是當一個可爲空的類型被傳遞給該函數時,它將被轉換爲它的值類型。所以如果我通過一個龍?值爲0,該函數返回DBNull,因爲長?被轉換爲Long,Long的值爲0相當於Nothing。無論如何,這個函數也適用於Nullable類型嗎?

如果沒有,我只是將回落到使用下面的語句,而不是一個普通的電話功能可按:

IIf(nullableVar.HasValue, nullableVar, DBNull.Value)) 

IIf(nonNullableVar IsNot Nothing , nonNullableVar, DBNull.Value)) 

回答

2

其實不是這樣的邏輯失敗。當評估像(x = y)或(x <> y)這樣的表達式時,如果任一參數都是Nothing,則VB.Net返回FALSE。你的條件總是落在ELSE子句中。因此,而不是:

if obj <> Nothing then 

試試這個:

if obj isnot nothing then 
+0

感謝您的答覆。作爲一名必須編寫VB.NET的C#開發人員,我仍然在努力處理'Nothing'的問題。 將'<>'更改爲'IsNot'可以解決問題。然而,我的答案有一個問題,我的原始評估'obj <> Nothing'適用於所有情況,除非比較值爲零的可爲空的值類型與無。當我將一個字符串傳遞給函數時,該函數正確地返回該字符串。 – 2010-08-25 12:34:12

+0

是否'<>'運算符將可空值類型轉換回正常值類型,這就是爲什麼當值類型的值爲0時,比較失敗並返回DBNull? – 2010-08-25 12:45:19

+0

可能有一些隱式轉換正在進行。 M $愛做「幫助」我們懦弱的VB程序員。我總是把Option Strict On作爲任何代碼文件的第一行來防止這種意外的行爲。 – Bill 2010-08-25 13:32:02