将NULL值分配给SqlParameter的最佳方法

时间:2012-12-20 22:04:33

标签: c# null sqlparameters

我在C#类方法中使用了许多可选的输入参数。由于可选语法在未使用参数时会创建值“0”,因此我在方法中调用的SQL插入命令将逐渐插入。但是,我需要命令在不使用参数时插入NULL值而不是0。在不使用大量“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);

7 个答案:

答案 0 :(得分:35)

是的,对于参数的值,只需使用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));

答案 1 :(得分:2)

您需要检查每个参数值并使用DBNull.Value发送null。我们在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 :(得分:2)

这是为sql参数

分配Null值的最简单方法
            command.Parameters.AddWithValue("@Comment", string.IsNullOrEmpty(comment) ? (object)DBNull.Value : comment);   

答案 3 :(得分:1)

考虑使用可用的Nullable(T)结构。它只允许您设置值,如果您拥有它们,您的SQL Command对象将识别可空值并相应地处理,而不会有麻烦。

答案 4 :(得分:0)

使用小帮助器类我们可以创建扩展方法来将DBNull.Value添加到sqlparameter

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,则此extenction方法将自动将其转换为DBNull并重新分配给sql参数。

因此无需担心我们动态传递的值。

答案 5 :(得分:0)

语法短!

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

答案 6 :(得分:0)

在必要时设置null datetime参数的另一种明确方法

http.request()