web-dev-qa-db-fra.com

Meilleure méthode d'attribution de valeur NULL à SqlParameter

J'ai un certain nombre de paramètres d'entrée facultatifs que j'utilise dans une méthode de classe C #. Étant donné que la syntaxe facultative crée une valeur de "0" lorsque le paramètre n'est pas utilisé, la commande d'insertion SQL que j'appelle dans la méthode termine l'insertion en tant que telle. Cependant, j'ai besoin de la commande pour insérer une valeur NULL au lieu d'un 0 lorsque le paramètre n'est pas utilisé. Quelle est la meilleure façon d'y parvenir sans utiliser une grande quantité de déclarations "si"?

Voici le code auquel je fais référence. Existe-t-il une syntaxe/une commande quelconque qui me permettra de spécifier une valeur NULL dans la déclaration 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);
17
NealR

Oui, pour la valeur du paramètre, utilisez simplement DBNull.Value. Par exemple:

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

Ou écrivez un petit aide:

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

Ensuite:

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

C'est le moyen le plus simple d'attribuer une valeur Null au paramètre sql

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

Vous devez vérifier chaque valeur de paramètre et utiliser DBNull.Value envoyer null. Nous avons une méthode d'extension désactivée object pour rendre cela un peu plus facile.

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

Usage:

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

Ou si vous souhaitez considérer une valeur arbitraire non par défaut comme valeur par défaut:

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

Pensez à utiliser la structure Nullable (T) disponible. Il vous permettra de définir uniquement des valeurs si vous les avez, et vos objets de commande SQL reconnaîtront la valeur nullable et traiteront en conséquence sans tracas de votre part.

1
Dillie-O

Une autre façon claire de définir un paramètre datetime nul si nécessaire

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
daniele3004

avec une petite classe d'assistance, nous pouvons créer une méthode d'extension pour ajouter 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);        
            }

        }
}

usage

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

_cmd.Parameters.AddParameter(_FraudPackageID);

si vous attribuez ou passez null comme valeur à sqlparameter, cette méthode d'extension la convertira automatiquement en DBNull et la réaffectera au sqlparameter.

donc pas besoin de vous soucier des valeurs que nous transmettons dynamiquement.

0
kavali rakesh

syntaxe courte!

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