首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DBNull里有什么

DBNull里有什么
EN

Stack Overflow用户
提问于 2016-01-14 22:22:21
回答 2查看 2K关注 0票数 0

我有一个存储过程,它有一个参数,可以空到十进制列。我编写的方法期望Dictionary<string, string>传递参数名称和值。

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

代码语言:javascript
复制
collection.Add(model.Name, DBNull.Value.ToString());

本质上,所有DBNull.Value返回都将是一个String.Empty。那么如何确保null被正确地传递给Server呢?否则,将引发异常,因为无效的列数据类型。文档声明,使用ToString,它将返回String.Empty

DBNull是一个单例类,这意味着只能存在这个类的实例。如果数据库字段缺少数据,则可以使用DBNull.Value属性向该字段显式分配DBNull对象值。但是,大多数数据提供程序都会自动这样做。若要计算数据库字段以确定其值是否为DBNull,可以将字段值传递给DBNull.Value.Equals方法。但是,这种方法很少使用,因为有许多其他方法来评估数据库字段是否丢失数据。这些方法包括Visual函数、Convert.IsDBNull方法、DataTableReader.IsDBNull方法、IDataRecord.IsDBNull方法和其他几种方法。

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

代码语言:javascript
复制
command.Parameters.AddWithValue(parameter.Key, parameter.Value);

一个传统的Ado.Net SqlDataReader

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-15 01:26:42

如果您有Dictionary<string, string>,并且在字典中有一个值,那么:

代码语言:javascript
复制
var dictionary = new Dictionary<string, string>() { { "hello", null } };

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

您可以编写一个小小的扩展方法,使传递给命令的事情变得更容易。

代码语言:javascript
复制
public static object ValueOrDbNull(this decimal? value)
{
    if (value.HasValue)
    {
        return value;
    }

    return DBNull.Value;
}

然后将其添加到您的命令中:

代码语言:javascript
复制
command.Parameters.Add("@your_proc_param", dec.ValueOrDbNull());

不应该存在以这种方式将其传递给过程的任何问题,因为您说过它被声明为可为空的十进制字段。

票数 1
EN

Stack Overflow用户

发布于 2016-01-14 23:16:03

我认为您必须从字典中获取每个值,然后在将参数传递给命令之前使用如下所示的代码。换句话说,将null存储为字典中的值,而不是DBNull,然后调用下面的代码将其从null转换为DBNull.Value。

代码语言:javascript
复制
        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;
        }

在重构之后,您可以这样做:

代码语言:javascript
复制
  public static object ToDBNull(object value) {
        if (value == null) {
            return DBNull.Value;
        }
        else {
            return value;
        }
    }

然后像这样调用ToDBNull函数:

代码语言:javascript
复制
        cmd.Parameters.AddWithValue("FirstName", ToDBNull(firstNameValue));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34800929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档