cmd.Parameters.AddWithValue可为null的内部

本文关键字:内部 null 可为 Parameters AddWithValue cmd | 更新日期: 2023-09-27 18:00:52

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

private int? _DependencyID;
public int? DependencyID
{ get {return _DependencyID;} set {_DependencyID = value;} }
public ConstructorMethod()
{
    _DependencyID = (int?)null;
}

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

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

如果_DependencyID有一个值,则一切正常。如果_DependencyID为空,我会得到错误:

参数化查询'(@param1(nvarchar(10(,@param2(nvarchar(255(,应为参数"@DependencyID"未提供

我发现了这篇文章[1],所以我试着这样调整代码:

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

不管怎样,都存在问题。我该如何处理?

提前感谢的任何帮助

cmd.Parameters.AddWithValue可为null的内部

您需要添加一个object:

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

你可以将其缩短为

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

我创建了一个扩展来简化代码。

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

AFAIC、ADO.NET/SQL不支持这种可以为null的类型。

最后一个例子在我看来最接近正确。你对它有什么问题?如果您只是得到一个与类型相关的编译错误,请将您的值强制转换为对象:

(object)DependencyID.Value;

由于:两侧的两个值必须是相同的类型。