C# cmd.Parameters.AddWithValue可为Null int
在我的数据层类中,我初始化了如下参数:C# cmd.Parameters.AddWithValue可为Null int,c#,asp.net,tsql,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"
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,则我得到错误:
参数化查询
“@param1nvarchar10,
@param2nvarchar255,应为
参数'@dependcyid,它是
未提供
我找到了这篇[文章][1],所以我试着像这样调整代码:
cmd.AddWithValue("@DependencyID", _DependencyID == null? DBNull.Value : _DependencyID);
and
cmd.AddWithValue("@DependencyID", _DependencyID == null? (int?) DBNull.Value : _DependencyID);
不管怎样,都有问题。我该怎么处理
提前感谢您提供的任何帮助AFAIC,ADO.NET/SQL不支持这种方式的可空类型 最后一个例子对我来说似乎最正确。你有什么问题?如果您刚刚遇到与类型相关的编译错误,请键入将值强制转换为对象:
(object)DependencyID.Value;
由于:两侧的两个值必须是同一类型。AFAIC,ADO.NET/SQL不支持这种可为空的类型 最后一个例子对我来说似乎最正确。你有什么问题?如果您刚刚遇到与类型相关的编译错误,请键入将值强制转换为对象:
(object)DependencyID.Value;
因为:两侧的两个值必须是同一类型。您需要添加一个对象:
你可以把它缩短为
cmd.AddWithValue("@DependencyID", (object)_DependencyID ?? DBNull.Value);
您需要添加一个对象:
你可以把它缩短为
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)
);
}
}
我创建了一个扩展来简化代码
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)
);
}
}
正如我所理解的,是不是因为DBNull.Value是一个对象,将_DependencyID强制转换为一个对象就可以实现这一点?所以cmd负责装箱和拆箱?顺便说一句,谢谢大家的快速回复。。。。斯莱克的回答突然向我袭来,我比其他人理解得更快。非常感谢。all@Bengal:不需要。您只需要强制转换来告诉编译器表达式是什么类型。就我所知,是不是因为DBNull.Value是一个对象,将_DependencyID强制转换为一个对象就可以工作?所以cmd负责装箱和拆箱?顺便说一句,谢谢大家的快速回复。。。。斯莱克的回答突然向我袭来,我比其他人理解得更快。非常感谢。all@Bengal:否。您只需要强制转换来告诉编译器表达式是什么类型。