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