Подтвердить что ты не робот

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

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

Ниже приведен код, на который я имею в виду. Есть ли синтаксис/некоторая команда, которая позволит мне указать значение NULL в объявлении 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);
4b9b3361

Ответ 1

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

Ответ 2

Вам нужно будет проверить каждое значение параметра и использовать DBNull.Value send 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));

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

Еще один четкий способ установки нулевого параметра 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 ;
}