Assign null à un SqlParameter

le code suivant donne une erreur -" aucune conversion implicite de DBnull à int."

SqlParameter[] parameters = new SqlParameter[1];    
SqlParameter planIndexParameter = new SqlParameter("@AgeIndex", SqlDbType.Int);
planIndexParameter.Value = (AgeItem.AgeIndex== null) ? DBNull.Value : AgeItem.AgeIndex;
parameters[0] = planIndexParameter;
143
demandé sur bluish 2010-12-29 19:42:07

17 réponses

le problème est que l'opérateur ?: ne peut pas déterminer le type de retour parce que vous retournez une valeur int ou une valeur de type DBNull, qui ne sont pas compatibles.

vous pouvez bien sûr lancer L'instance D'AgeIndex pour être de type object qui satisferait à l'exigence ?: .

vous pouvez utiliser le ?? opérateur nul-coalescent comme suit

SqlParameter[] parameters = new SqlParameter[1];     
SqlParameter planIndexParameter = new SqlParameter("@AgeIndex", SqlDbType.Int);
planIndexParameter.Value = (object)AgeItem.AgeIndex ?? DBNull.Value;
parameters[0] = planIndexParameter; 

voici un citation de la documentation MSDN pour le ?: opérateur qui explique le problème

Soit le type de first_expression et second_expression doit être la même, ou une conversion implicite doit exister d'un type à l'autre.

273
répondu Chris Taylor 2015-11-23 18:19:17

Les accepté de répondre suggère l'utilisation d'une fonte. Cependant, la plupart des types SQL ont un champ Nul qui peut être utilisé pour éviter cette distribution.

par exemple, SqlInt32.Null "représente un DBNull qui peut être assigné à cette instance de la classe SqlInt32."

int? example = null;
object exampleCast = (object) example ?? DBNull.Value;
object exampleNoCast = example ?? SqlInt32.Null;
71
répondu Brian 2017-05-23 12:18:15

il faut passer DBNull.Valeur comme paramètre null dans SQLCommand, à moins qu'une valeur par défaut ne soit spécifiée dans la procédure stockée (si vous utilisez la procédure stockée). La meilleure approche consiste à assigner DBNull.Valeur pour tout paramètre manquant avant l'exécution de la requête, et la foreach suivante fera le travail.

foreach (SqlParameter parameter in sqlCmd.Parameters)
{
    if (parameter.Value == null)
    {
        parameter.Value = DBNull.Value;
    }
}

autrement modifier cette ligne:

planIndexParameter.Value = (AgeItem.AgeIndex== null) ? DBNull.Value : AgeItem.AgeIndex;

comme suit:

if (AgeItem.AgeIndex== null)
    planIndexParameter.Value = DBNull.Value;
else
    planIndexParameter.Value = AgeItem.AgeIndex;

parce que vous ne pouvez pas utiliser différents types de valeurs dans l'énoncé conditionnel, comme DBNull et int sont différents les uns des autres. Espérons que cela aidera.

21
répondu ShahidAzim 2010-12-29 16:58:53

avec une ligne de code, essayez ceci:

var piParameter = new SqlParameter("@AgeIndex", AgeItem.AgeIndex ?? (object)DBNull.Value);
10
répondu Adrian 2017-07-28 19:11:36

essayez ceci:

SqlParameter[] parameters = new SqlParameter[1];    
SqlParameter planIndexParameter = new SqlParameter("@AgeIndex", SqlDbType.Int);

planIndexParameter.IsNullable = true; // Add this line

planIndexParameter.Value = (AgeItem.AgeIndex== null) ? DBNull.Value : AgeItem.AgeIndex== ;
parameters[0] = planIndexParameter;
5
répondu decyclone 2010-12-29 16:53:21

à mon avis, la meilleure façon est de le faire avec le paramètres propriété de la SqlCommand classe:

public static void AddCommandParameter(SqlCommand myCommand)
{
    myCommand.Parameters.AddWithValue(
        "@AgeIndex",
        (AgeItem.AgeIndex== null) ? DBNull.Value : AgeItem.AgeIndex);
}
1
répondu 2010-12-29 16:45:52

envisager d'utiliser la structure(T) nulle disponible. Cela ne vous permettra de définir des valeurs que si vous les avez, et vos objets de commande SQL reconnaîtront la valeur nullable et traiteront en conséquence sans tracas de votre côté.

1
répondu Kanwar Singh 2014-05-02 06:13:24

si vous utilisez l'opérateur conditionnel(ternaire) le compilateur a besoin d'une conversion implicite entre les deux types, sinon vous obtenez une exception.

pour que vous puissiez le fixer en moulant l'un des deux à System.Object :

planIndexParameter.Value = (AgeItem.AgeIndex== null) ? DBNull.Value : (object) AgeItem.AgeIndex;

mais comme le résultat n'est pas vraiment joli et que vous devez toujours vous souvenir de ce casting, vous pouvez utiliser une telle méthode d'extension à la place:

public static object GetDBNullOrValue<T>(this T val)
{
    bool isDbNull = true;
    Type t = typeof(T);

    if (Nullable.GetUnderlyingType(t) != null)
        isDbNull = EqualityComparer<T>.Default.Equals(default(T), val);
    else if (t.IsValueType)
        isDbNull = false;
    else
        isDbNull = val == null;

    return isDbNull ? DBNull.Value : (object) val;
}

, Alors vous pouvez utiliser ce code concis:

planIndexParameter.Value = AgeItem.AgeIndex.GetDBNullOrValue();
1
répondu Tim Schmelter 2016-09-12 08:58:28

essayez ceci:

if (AgeItem.AgeIndex != null)
{
   SqlParameter[] parameters = new SqlParameter[1];
   SqlParameter planIndexParameter = new SqlParameter("@AgeIndex", SqlDbType.Int);
   planIndexParameter.Value = AgeItem.AgeIndex;
   parameters[0] = planIndexParameter;
}

en d'autres termes, si le paramètre est nul, ne l'envoyez pas à votre proc stocké (en supposant, bien sûr, que le proc stocké accepte les paramètres nuls qui sont implicites dans votre question).

0
répondu Flipster 2011-01-05 06:27:01

essayez quelque chose comme ceci:

if (_id_categoria_padre > 0)
{
    objComando.Parameters.Add("id_categoria_padre", SqlDbType.Int).Value = _id_categoria_padre;
}
else
{
    objComando.Parameters.Add("id_categoria_padre", DBNull.Value).Value = DBNull.Value;
}
0
répondu user2574441 2013-07-11 22:16:08
int? nullableValue = null;
object nullableValueDB
{
   get{
       if(nullableValue==null)
          return DBNull.Value;
       else
          return (int)nullableValue;
   }
}

Je résous comme ça.

0
répondu A Sinan Direk 2014-03-01 11:55:27
if (_id_categoria_padre > 0)
{
    objComando.Parameters.Add("id_categoria_padre", SqlDbType.Int).Value = _id_categoria_padre;
}
else
{
    objComando.Parameters.Add("id_categoria_padre", DBNull.Value).Value = DBNull.Value;
}
0
répondu Anil Kumar 2014-05-02 06:13:36
if (AgeItem.AgeIndex== null)  
    cmd.Parameters.Add(new SqlParameter("ParaMeterName", SqlDbType.DateTime).Value = DBNull);  
else  
    cmd.Parameters.Add(new SqlParameter("ParaMeterName", SqlDbType.DateTime).Value = AgeItem.AgeIndex);
0
répondu Anil Kumar 2014-05-02 06:13:49

C'est tout simplement ce que je fais...

        var PhoneParam = new SqlParameter("@Phone", DBNull.Value);
        if (user.User_Info_Phone != null)
        {
            PhoneParam.SqlValue = user.User_Info_Phone;
        }

        return this.Database.SqlQuery<CustLogonDM>("UpdateUserInfo @UserName, @NameLast, @NameMiddle, @NameFirst, @Address, @City, @State, @PostalCode, @Phone",
            UserNameParam, NameLastParam, NameMiddleParam, NameFirstParam, AddressParam, CityParam, StateParam, PostalParam, PhoneParam).Single();
0
répondu Tom Mack 2015-06-13 18:59:31
            dynamic psd = DBNull.Value;

            if (schedule.pushScheduleDate > DateTime.MinValue)
            {
                psd = schedule.pushScheduleDate;
            }


            sql.DBController.RunGeneralStoredProcedureNonQuery("SchedulePush",
                     new string[] { "@PushScheduleDate"},
                     new object[] { psd }, 10, "PushCenter");
0
répondu papapa 2016-07-15 22:24:32

une méthode d'extension simple pour cela serait:

    public static void AddParameter(this SqlCommand sqlCommand, string parameterName, 
        SqlDbType sqlDbType, object item)
    {
        sqlCommand.Parameters.Add(parameterName, sqlDbType).Value = item ?? DBNull.Value;
    }
0
répondu Mark 2017-03-27 18:19:23

y a-t-il quelque chose de mal à créer simplement le paramètre "nullable" faire?

    public SqlParameter GetNullableParameter(string parameterName, object value)
    {
        if (value == null)
        {
            return new SqlParameter(parameterName, value);
        }
        else
        {
            return new SqlParameter(parameterName, DBNull.Value);
        }
    }
0
répondu Zhi An 2017-04-09 04:38:40