什么在DBNull

时间:2016-01-14 22:22:21

标签: c# sql-server

我有一个存储过程,其参数可以为十进制列。我写的方法需要Dictionary<string, string>传递参数名称和值。

但是,当我这样做时,我会使用反射GetValue

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

实质上,所有DBNull.Value次返回都是String.Empty。那么如何确保将null正确传递给SQL Server?否则会抛出异常,因为列数据类型无效。 ToStringString.Empty状态command.Parameters.AddWithValue(parameter.Key, parameter.Value); 将返回SqlDataReader

  

DBNull是一个单例类,这意味着只有这个实例   班级可以存在。如果数据库字段缺少数据,则可以使用   DBNull.Value属性,用于显式分配DBNull对象值   场。但是,大多数数据提供商会自动执至   评估数据库字段以确定它们的值是否为DBNull,   您可以将字段值传递给DBNull.Value.Equals方法。   但是,这种方法很少使用,因为有很多   评估数据库字段以查找缺失数据的其他方法。这些   包括Visual Basic IsDBNull函数,Convert.IsDBNull   方法,DataTableReader.IsDBNull方法,IDataRecord.IsDBNull   方法和其他几种方法。

这将以下列方式添加到数据库中:

var dir = new DirectoryInfo("somedir");
if (dir.Exists)
{
   dir.Delete(true);
   dir.Refresh();
}

dir.Create();

传统的Ado.Net <div> <?php // this is my comment ?> <div>Hello world</div> </div>

2 个答案:

答案 0 :(得分:2)

我认为你必须从Dictionary中获取每个值,然后在将参数传递给命令之前使用如下所示的代码。换句话说,将null存储为Dictionary中的值,而不是DBNull,然后调用下面的代码将null转换为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));

答案 1 :(得分:1)

如果你有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());

以这种方式传递给程序不应该有任何问题,因为你说它被声明为可以为空的十进制字段。