簡體   English   中英

如何在不檢查null或0的情況下為sqlparameter NULL值賦值?

[英]How to assign a value to sqlparameter NULL values without checking for null or 0?

需要進行以下檢查以檢查空值。 我有辦法直接做到嗎?

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

有沒有辦法我們可以通過這個檢查和一個設計,我們可以避免對每個值進行重復檢查? (順便說一句,它只是一個邏輯,0對於我的情況被解釋為NULL,但我也要求像字符串這樣的可空對象一樣)

你可以使用?:Operator

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

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

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

然后用它作為:

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

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

但這對你的情況沒有幫助,因為你試圖將非null值合並為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。

如果您經常這樣做,請嘗試將檢查放在方法內。

例如:

// ...
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;
    }
}

你可以用?? 運營商:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM