使用SqlCommand +参数将数据库值设置为null

问题描述:

我以前曾经教过如何在.NET的SQL查询中设置参数(click)。使用SqlCommand +参数将数据库值设置为null

使用带参数的参数很好,但是当我尝试将数据库中的字段设置为空时,我不成功。该方法可能认为我没有设置有效的参数或没有指定参数。

例如

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 

有什么我失踪了吗?我做错了吗?

你想要DBNull。价值。

在我的共享DAL代码,我使用的是只是做一个辅助方法:

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

这是一个非常好的解决方案。从现在起,我将在所有Command.Execute()调用之前使用它。 – prespic 2014-10-20 22:05:09

尝试将其设置为DbNull.Value

我用SqlParameterCollection扩展方法,让我添加参数与空值。它负责将null转换为DBNull。 (对不起,我不精通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); 
    } 
} 

用法:

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