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

34

我之前在这个回答 (点击) 学习了如何在 .NET 中设置 SQL 查询参数。

使用带有值的参数是可以的,但当我尝试将数据库中的字段设置为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

我有什么遗漏吗?我做错了什么吗?

3个回答

90

你想要的是DBNull.Value。

在我的共享DAL代码中,我使用一个帮助方法,仅执行以下操作:

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

这是一个非常好的解决方案。从现在开始,在我所有的Command.Execute()调用之前,我都会使用它。 - prespic

10

我使用一个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);

3
尝试将其设置为 DbNull.Value

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接