将NULL值赋给SqlParameter的最佳方法

20

我有一些可选的输入参数,我在C#类方法中使用它们。 由于可选语法在未使用参数时创建一个值为“0”的值,因此我调用的SQL插入命令最终会插入这样的值。 然而,当不使用参数时,我需要命令插入一个NULL值,而不是0。 有没有办法在SqlParameter声明中指定一个NULL值,以实现此目的,而不需要使用大量的“if”语句?

以下是我正在引用的代码。 是否有语法/某种命令可以让我在SqlParameter声明中指定一个NULL值?

public int batchInsert
(
    int id, 
    int outcome, 
    int input = 0, 
    int add = 0, 
    int update = 0,
    int delete = 0,
    int errors = 0, 
    int warnings = 0
)
{
    string sts;
    if (outcome == 0)
    {
        sts = "S";
    }
    else if (outcome == 1)
    {
        sts = "W";
    }
    else
    {
        sts = "E";
    }

    SqlConnection sqlConn = new SqlConnection(this.connString);
    SqlParameter runId = new SqlParameter("@runId", id);
    SqlParameter endTime = new SqlParameter("@endTime", DateTime.Now);
    SqlParameter status = new SqlParameter("@status", sts);
    SqlParameter sqlInput = new SqlParameter("@itemsRead", input);
    SqlParameter sqlAdd = new SqlParameter("@add", add);
    SqlParameter sqlUpdate = new SqlParameter("@update", update);
    SqlParameter sqlDelete = new SqlParameter("@delete", delete);
    SqlParameter sqlError = new SqlParameter("@errors", errors);
    SqlParameter sqlWarning = new SqlParameter("@warnings", warnings);
    SqlParameter result = new SqlParameter("@outcome", results[outcome]);
    SqlCommand sqlComm = new SqlCommand(insertCommand(), sqlConn);

您是否有在数据库表中写入零是合法值的情况? - Steve
如果您在C#中使用可空类型,可以使用以下语法将数据库中的NULL替换为C#中的nullmyVariable ?? (object)DBNull.Value - HABO
7个回答

40

是的,对于参数的值,只需使用 DBNull.Value。例如:

SqlParameter sqlError = 
    new SqlParameter("@errors", errors == 0 ? (object)DBNull.Value : errors);

或者编写一个小助手:

private object ValueOrDBNullIfZero(int val) {
   if ( val == 0 ) return DBNull.Value;
   return val;
}

然后:

SqlParameter sqlError = 
    new SqlParameter("@errors", ValueOrDBNullIfZero(errors));

由于某些原因,我只看到了“是的,对于参数的值,只需使用 DbNull.Value”这一部分,而没有看到示例。谢谢! - NealR
@georgem - 是的,我认为那也应该可以,尽管大多数情况下 ADO.NET 足够聪明,能够自动将 null 值转换为 DbNull.Value,所以我不确定是否有必要这样做。 - Eric Petroelje
谢谢,非常适合我的需求。不要忘记在表列上允许空值。 - Benny Margalit
谢谢您。这正是我在编写的代码所需要的。 - Gustav Swanepoel

3

这是将Null值分配给SQL参数的最简单方法

            command.Parameters.AddWithValue("@Comment", string.IsNullOrEmpty(comment) ? (object)DBNull.Value : comment);   

另一个选项是使用 Convert.DBNull 而不是 (object)DBNull.Value。例如(带有可空整数):command.Parameters.AddWithValue("@optionalParam", id.HasValue ? id.Value : Convert.DBNull); - digiogo

3

您需要检查每个参数值,并使用DBNull.Value来发送空值。我们有一个针对object的扩展方法,可以使此过程变得更加容易。

public static class ObjectExtensions
{
    public static object OptionalParam<T>(this T value, T optionalValue = default(T))
    {
        return Equals(value,optionalValue) ? (object)DBNull.Value : value;
    }
}

使用方法:

var sqlInput = new SqlParameter("@itemsRead", input.OptionalParam());

或者,如果您想将非默认的任意值视为默认值:

var sqlInput = new SqlParameter("@itemsRead", input.OptionalParam(-1));

2

通过一个小帮助类,我们可以创建扩展方法来向SqlParameter中添加DBNull.Value。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Data;
using System.Data.Common;

namespace System.Data.SqlClient
{
    public static class ExtensionMethods 

    {



        public static SqlParameter AddParameter(this SqlParameterCollection parms, SqlParameter param)
        {
            if (param.Value == null)
            {
                param.Value = DBNull.Value;
                return parms.Add(param);
            }
            else
            {
                return parms.Add(param);        
            }

        }
}

使用
SqlParameter _FraudPackageID = new SqlParameter("@FraudPackageID", System.Data.SqlDbType.BigInt);
 _FraudPackageID.Value = FraudPackageID;
 _FraudPackageID.Direction = System.Data.ParameterDirection.Input;

_cmd.Parameters.AddParameter(_FraudPackageID);

如果您将null分配或传递给SqlParameter,此扩展方法将自动将其转换为DBNull并重新分配给SqlParameter。因此,不需要担心我们正在动态传递的值。

1
考虑使用可空结构 Nullable(T)。它将允许您仅在拥有值时设置值,您的 SQL 命令对象将识别可空值并在您的端点上无需麻烦地进行处理。

0

另一种明确的方法是在必要时设置空的日期时间参数

if(obj.myDate == DateTime.MinValue)
{
    aCommand.Parameters.Add("dateParameter", SqlDbType.Date).Value = DBNull.Value;
}
else
{
    aCommand.Parameters.Add("dateParameter", SqlDbType.Date).Value = obj.myDate ;
}

0

简短语法!

  cmd.Parameters.Add(new SqlParameter{SqlValue=username ?? (object)DBNull.Value,ParameterName="usuario" }  );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接