Лучший способ присвоения нулевого значения SqlParameter

У меня есть несколько дополнительных входных параметров, которые я использую в методе класса C#. Поскольку необязательный синтаксис создает значение "0", когда параметр не используется, команда SQL insert, которую я вызываю в методе, завершает вставку как таковую. Однако мне нужна команда для вставки нулевого значения вместо 0, когда параметр не используется. Каков наилучший способ сделать это без использования большого количества операторов "if"?

Ниже приведен код, о котором я говорю. Есть есть синтаксис / какая-то команда, которая позволит мне указать нулевое значение в объявлении SqlParameter?

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 ответов


Да, для значения параметра, просто использовать 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 передать значение 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));

Это самый простой способ присвоить значение Null параметру sql

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

рассмотрите возможность использования Nullable (T) структура доступна. Это позволит вам устанавливать значения, только если они у вас есть, и ваши объекты SQL Command распознают значение nullable и обрабатывают соответственно без проблем с вашей стороны.


С небольшой вспомогательный класс, мы можем создать метод extenction добавить значение dbnull.Значение для 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, этот метод расширения автоматически преобразует его в DBNull и переназначает в sqlparameter.

поэтому не нужно беспокоиться о том, какие значения мы передаем динамически.


короткий синтаксис!

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

другой ясный способ установить параметр null datetime при необходимости

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