簡體   English   中英

DBNull中的內容

[英]What in the DBNull

我有一個存儲過程,該存儲過程的參數可以為小數列為空。 我編寫的方法期望Dictionary<string, string>傳遞參數名稱和值。

但是,當我在執行GetValue時使用反射時:

collection.Add(model.Name, DBNull.Value.ToString());

本質上,所有DBNull.Value返回都將是String.Empty 那么,如何確保將null正確傳遞給SQL Server? 否則會拋出異常,因為列數據類型無效。 文檔指出,使用ToString它將返回String.Empty

DBNull是一個單例類,這意味着只能存在此類的該實例。 如果數據庫字段缺少數據,則可以使用DBNull.Value屬性為該字段顯式分配DBNull對象值。 但是,大多數數據提供程序會自動執行此操作。 要評估數據庫字段以確定它們的值是否為DBNull,可以將字段值傳遞給DBNull.Value.Equals方法。 但是,這種方法很少使用,因為還有許多其他方法可以評估數據庫字段中是否缺少數據。 這些包括Visual Basic IsDBNull函數,Convert.IsDBNull方法,DataTableReader.IsDBNull方法,IDataRecord.IsDBNull方法以及其他幾種方法。

可以通過以下方式將其添加到數據庫中:

command.Parameters.AddWithValue(parameter.Key, parameter.Value);

傳統的Ado.Net SqlDataReader

我認為您必須從Dictionary中獲取每個值,然后在將參數傳遞給命令之前使用如下所示的代碼。 換句話說,將空值存儲為Dictionary中的值,而不是DBNull,然后調用下面的代碼將空值轉換為DBNull.Value。

        SqlParameter firstNameParam = new SqlParameter("FirstName", System.Data.SqlDbType.NVarChar);
        string firstNameValue = null; // this is the value from the Dictionary
        if (firstNameValue == null) {
            firstNameParam.Value = DBNull.Value;
        }
        else {
            firstNameParam.Value = firstNameValue;
        }

重構之后,您可以執行以下操作:

  public static object ToDBNull(object value) {
        if (value == null) {
            return DBNull.Value;
        }
        else {
            return value;
        }
    }

然后像這樣調用ToDBNull函數:

        cmd.Parameters.AddWithValue("FirstName", ToDBNull(firstNameValue));

如果您有Dictionary<string, string> ,並且在字典中有一個值,例如:

var dictionary = new Dictionary<string, string>() { { "hello", null } };

string data = dictionary["hello"];
var dec = data == null ? (decimal?)null : Convert.ToDecimal(data);

您可以編寫一些擴展方法,使將其傳遞給命令更容易

public static object ValueOrDbNull(this decimal? value)
{
    if (value.HasValue)
    {
        return value;
    }

    return DBNull.Value;
}

然后像這樣將其添加到您的命令中:

command.Parameters.Add("@your_proc_param", dec.ValueOrDbNull());

以這種方式將其傳遞給過程應該沒有任何問題,因為您說它被聲明為可空的十進制字段。

暫無
暫無

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

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