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);
不管怎样,都存在问题。我该如何处理?
提前感谢的任何帮助
您需要添加一个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;
由于:
两侧的两个值必须是相同的类型。