2008-10-04 16 views
26

Me enseñaron anteriormente cómo configurar parámetros en una consulta SQL en .NET en esta respuesta (click).Establecer un valor de base de datos para anular con un SqlCommand + parámetros

El uso de parámetros con valores está bien, pero cuando intento establecer un campo en la base de datos para anular, no tengo éxito. O el método piensa que no estoy estableciendo un parámetro válido o que no especifica un parámetro.

p. Ej.

Dim dc As New SqlCommand("UPDATE Activities SET [Limit] = @Limit WHERE [Activity] = @Activity", cn) 

If actLimit.ToLower() = "unlimited" Then 
    ' It's not nulling :(
    dc.Parameters.Add(New SqlParameter("Limit", Nothing)) 
Else 
    dc.Parameters.Add(New SqlParameter("Limit", ProtectAgainstXSS(actLimit))) 
End If 

¿Hay algo que me falta? ¿Lo estoy haciendo mal?

Respuesta

64

usted quiere DBNull .Value.

En mi código DAL compartida, utilizo un método de ayuda que simplemente:

foreach (IDataParameter param in cmd.Parameters) 
    { 
     if (param.Value == null) param.Value = DBNull.Value; 
    } 
+0

Esa es una muy buena solución. A partir de ahora lo usaré antes de todas mis llamadas Command.Execute(). – prespic

3

Intente configurarlo en DbNull.Value.

6

utilizo un método SqlParameterCollection extensión que me permite añadir un parámetro con un valor anulable. Se encarga de convertir null a DBNull. (Lo siento, no soy fluido en VB.)

public static class ExtensionMethods 
{ 
    public static SqlParameter AddWithNullable<T>(this SqlParameterCollection parms, 
      string parameterName, T? nullable) where T : struct 
    { 
     if (nullable.HasValue) 
      return parms.AddWithValue(parameterName, nullable.Value); 
     else 
      return parms.AddWithValue(parameterName, DBNull.Value); 
    } 
} 

Uso:

string? optionalName = "Bozo"; 
cmd.Parameters.AddWithNullable("@Name", optionalName); 
Cuestiones relacionadas