[英]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.