2014-02-07 33 views
3

需要進行以下檢查以檢查空值。有沒有辦法直接做到這一點?如何將值分配給sqlparameter NULL值而不檢查null或0?

if(node.ID==0) 
{ 
    cmd.Parameters["@ID"].Value = DBNull.Value; 
} 
    else 
    { 
    cmd.Parameters["@ID"].Value = node.ID; 
    } 

有沒有辦法我們可以證明這種檢查和設計,我們可以避免這種重複檢查每個值? (順便說一下它只是0邏輯被解釋爲NULL我的情況,但我問類似的字符串爲空的對象也一樣)

+0

你可以使用三元運算符(?:)將其全部寫入一行,這會有幫助嗎? – Dirk

+0

請注意,它對於可空類型(引用或可爲空值類型)是一個非常不同的答案。是否有任何理由讓你的'ID'屬性不是'Nullable '或者其他什麼? –

+0

如果你不小心寫入了數據庫,你真的不想要什麼?您可能會希望之前的檢查是必需的。發生異常時,有時不是件壞事。 – Johnny

回答

4

對於可空類型,我只用一個擴展方法:

public static object CoalesceNullToDBNull(this object input) 
{ 
    return input == null ? DBNull.Value : input; 
} 

然後用它作爲:

cmd.Parameters["Foo"].Value = someExpression.CoalesceNullToDBNull(); 

(你可以給它當然是一個較短的名字。)

雖然這不會對您的情況有所幫助,因爲您試圖將非空值合併爲空。我個人會考慮重新設計你的模型 - 對於可以爲null的值使用可爲null的類型,而不是使用幻數。但是,您可以仍然使用一個通用的擴展方法:

public static object CoalesceDefaultToDBNull<T>(this T input) 
{ 
    return EqualityComparer<T>.Default.Equals(input, default(T)) 
     ? DBNull.Value : (object) input; 
} 

這將0'\0'falsenull等轉換爲DBNull.Value。你不得不使用非常謹慎,雖然,我認爲有很多的地方,一個0真的應該是0

5

您可以使用?: Operator

cmd.Parameters["@ID"].Value = node.ID == 0 ? (object)DBNull.Value : node.ID; 
0

如果你這樣做定期嘗試將檢查放入方法中。

例如:

// ... 
SetFormattedValue(ref cmd, node.ID); 
// ... 

private void SetFormattedValue(ref IDBCommand cmd, int id) // IDBCommand - or whatever your command type is 
{ 
    if(node.ID==0) 
    { 
     cmd.Parameters["@ID"].Value = DBNull.Value; 
    } 
    else 
    { 
     cmd.Parameters["@ID"].Value = node.ID; 
    } 
} 
0

可以使用??操作:

cmd.Parameters["@ID"].Value = node.ID ?? (object)DBNull.Value 
相關問題