cmd.Parameters.AddWithValue可以为null

时间:2011-06-30 16:28:32

标签: c# asp.net tsql

在我的数据层类中,我初始化一个如下参数:

private int? _DependencyID;

public int? DependencyID
{ get {return _DependencyID;} set {_DependencyID = value;} }

public ConstructorMethod()
{
    _DependencyID = (int?)null;
}

在类Insert()方法中,我正在尝试

cmd.AddWithValue("@DependencyID", _DependencyID);

如果_DependencyID有一个值,一切都很好。 如果_DependencyID为null,则会收到错误:

  

参数化查询   “(@参数1(为nvarchar(10),   @param2(nvarchar(255),期望   参数'@DependecyID',这是   没提供

我找到了[文章] [1],所以我尝试调整代码如下:

cmd.AddWithValue("@DependencyID", _DependencyID == null? DBNull.Value : _DependencyID); 

                           and
cmd.AddWithValue("@DependencyID", _DependencyID == null? (int?) DBNull.Value : _DependencyID); 

无论哪种方式,都存在问题。我该怎么办呢?

提前感谢您提供任何帮助

3 个答案:

答案 0 :(得分:5)

您需要添加object

cmd.AddWithValue("@DependencyID", _DependencyID == null? DBNull.Value : (object)_DependencyID); 

您可以将其缩短为

cmd.AddWithValue("@DependencyID", (object)_DependencyID ?? DBNull.Value); 

答案 1 :(得分:1)

我已经为代码创建了一个扩展名。

public static class SQLExtension
{
    public static SqlParameter AddWithNullable<T>(
        this SqlParameterCollection collection, 
        string parameterName, 
        Nullable<T> value) where T : struct, IComparable
    {
        return collection.AddWithValue(
            parameterName, (value.HasValue ? value.Value : (object)DBNull.Value)
        );
    }
}

以下是如何使用它。

cmd.AddWithNullable("@DependencyID", _DependencyID);

答案 2 :(得分:0)

AFAIC,ADO.NET / SQL不支持这种可空类型。

最后一个例子对我来说最接近正确。你有什么问题吗?如果您只是收到与类型相关的编译错误,请键入将您的值转换为object:

(object)DependencyID.Value;

由于:两侧的两个值必须属于同一类型。