2008-10-04 8 views
26

Ich war früher unterrichtete heute, wie Sie Parameter in einer SQL-Abfrage in .NET in dieser Antwort (click) festlegen.Setzen Sie einen Datenbankwert auf Null mit einem SqlCommand + -Parameter

Die Verwendung von Parametern mit Werten ist in Ordnung, aber wenn ich versuche, ein Feld in der Datenbank auf Null zu setzen, bin ich nicht erfolgreich. Entweder denkt die Methode, dass ich keinen gültigen Parameter einstelle oder keinen Parameter festlege.

z.B.

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 

Gibt es etwas, das mir fehlt? Mache ich es falsch?

Antwort

64

Sie möchten DBNull .Value.

In meinem gemeinsamen DAL-Code verwende ich eine Hilfsmethode, die gerade tut:

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

, dass eine wirklich gute Lösung ist. Ab jetzt werde ich es vor allen meinen Command.Execute() -Aufrufen verwenden. – prespic

3

Versuchen Sie es auf DbNull.Value einzustellen.

6

ich eine SqlParameterCollection Erweiterung Methode verwenden, die ich einen Parameter mit einem Nullable-Werten hinzufügen kann. Es sorgt dafür, dass null in DBNull konvertiert wird. (Sorry, bin ich in VB nicht fließend.)

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); 
    } 
} 

Verbrauch:

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