在我的数据层类中,我初始化一个如下参数:
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);
无论哪种方式,都存在问题。我该怎么办呢?
提前感谢您提供任何帮助
答案 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;
由于:
两侧的两个值必须属于同一类型。