C# 数据库中有什么

C# 数据库中有什么,c#,sql-server,C#,Sql Server,我有一个存储过程,它的一个参数可以为十进制列的null。我编写的方法需要一个字典来传递参数名和值 但是,当我使用反射来GetValue时: collection.Add(model.Name, DBNull.Value.ToString()); 实际上,所有DBNull.Value返回的都是字符串.Empty。那么,如何确保将null正确地传递给SQL Server呢?否则将引发异常,因为列数据类型无效。状态,使用ToString将返回String.Empty DBNull是一个单例类,这意味

我有一个存储过程,它的一个参数可以为十进制列的null。我编写的方法需要一个
字典
来传递参数名和值

但是,当我使用反射来
GetValue
时:

collection.Add(model.Name, DBNull.Value.ToString());
实际上,所有
DBNull.Value
返回的都是
字符串.Empty
。那么,如何确保将null正确地传递给SQL Server呢?否则将引发异常,因为列数据类型无效。状态,使用
ToString
将返回
String.Empty

DBNull是一个单例类,这意味着只有该类的这个实例 类可以存在。如果数据库字段缺少数据,可以使用 要显式分配DBNull对象值的DBNull.Value属性 田野。但是,大多数数据提供程序会自动执行此操作。到 计算数据库字段以确定其值是否为DBNull, 可以将字段值传递给DBNull.value.Equals方法。 然而,这种方法很少使用,因为有许多 评估数据库字段是否缺少数据的其他方法。这些 包括Visual Basic IsDBNull函数、Convert.IsDBNull 方法,DataTableReader.IsDBNull方法,IDataRecord.IsDBNull方法 方法,以及其他几种方法

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

command.Parameters.AddWithValue(parameter.Key, parameter.Value);

传统的Ado.Net
SqlDataReader

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

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

如果您有
字典
,并且字典中的值如下所示:

var dictionary = new Dictionary<string, string>() { { "hello", null } };

string data = dictionary["hello"];
var dec = data == null ? (decimal?)null : Convert.ToDecimal(data);
然后将其添加到命令中,如下所示:

command.Parameters.Add("@your_proc_param", dec.ValueOrDbNull());

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

如果您有
字典,并且字典中的值如下所示:

var dictionary = new Dictionary<string, string>() { { "hello", null } };

string data = dictionary["hello"];
var dec = data == null ? (decimal?)null : Convert.ToDecimal(data);
然后将其添加到命令中,如下所示:

command.Parameters.Add("@your_proc_param", dec.ValueOrDbNull());

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

对于空值,您通常指定
null
作为值。空字符串通常不被视为空字符串。您是否通过ADO.NET将此参数添加到SqlCommand中?@SamAxe我理解,但为什么
DBNull.Value
会返回空字符串,你不希望它是一个
null
?@Greg下面的
var mystring=string.Empty
var mystring=(默认)string之间有区别,在控制台中运行它们,你会理解你自己的评论/问题,你也可以阅读
Convert.IsDBNull()
functionnull是一个非常奇怪的概念。根据定义,null表示没有值。因此,如果您计划将值化(这是一个单词吗?)为null,那么您必须选择一个非null的值。哇!我们能在这里少用一些令人困惑的术语吗?:)无论如何,
DBNull.Value
表示非值的值。。因此,开发人员选择了一个空字符串来表示这一点。它不准确,但它是什么。另外,从技术角度来看,您不能将方法附加到
null
,因此如果
DBNull.Value
null
,您永远不能执行
DBNull.Value.Tostring()
。对于null值,您通常将
null
指定为值。空字符串通常不被视为空字符串。您是否通过ADO.NET将此参数添加到SqlCommand中?@SamAxe我理解,但为什么
DBNull.Value
会返回空字符串,你不希望它是一个
null
?@Greg下面的
var mystring=string.Empty
var mystring=(默认)string之间有区别,在控制台中运行它们,你会理解你自己的评论/问题,你也可以阅读
Convert.IsDBNull()
functionnull是一个非常奇怪的概念。根据定义,null表示没有值。因此,如果您计划将值化(这是一个单词吗?)为null,那么您必须选择一个非null的值。哇!我们能在这里少用一些令人困惑的术语吗?:)无论如何,
DBNull.Value
表示非值的值。。因此,开发人员选择了一个空字符串来表示这一点。它不准确,但它是什么。另外,从技术角度来看,您不能将方法附加到
null
,因此如果
DBNull.Value
null
,您就永远无法执行
DBNull.Value.Tostring()