繁体   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