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);
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));
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);
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));
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.
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 ;
}
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.
syntaxe courte!
cmd.Parameters.Add(new SqlParameter{SqlValue=username ?? (object)DBNull.Value,ParameterName="usuario" } );