2011-06-30 37 views
1

在我的数据层阶级,我初始化参数,像这样:cmd.Parameters.AddWithValue可空INT

private int? _DependencyID; 

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

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

在类insert()方法,我试图

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

如果_DependencyID有一个价值,一切都很好。 如果_DependencyID是空的,我得到错误:

The parameterized query '(@param1(nvarchar(10), @param2(nvarchar(255), expects the parameter '@DependecyID", which was not supplied

我发现这个[文章] [1],所以我试图调整,像这样的代码:

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

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

无论哪种方式,有问题。我该如何处理?

在此先感谢您的帮助

回答

5

您需要添加一个object

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

可以缩短,要

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

只是所以我明白,是因为DBNull.Value是一个对象,它将_DependencyID投射到一个对象使得这项工作?所以cmd负责拳击和拆箱? – Bengal

+0

顺便说一句,谢谢大家的快速回复.... SLak的答案刚刚跳出来,我比其他人更快地理解它。谢谢大家 – Bengal

+0

@孟加拉语:不,你只需要投射就可以告诉编译器表达式是什么类型。 – SLaks

0

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

最后一个例子对我来说看起来最接近正确。你有什么样的问题?如果您是刚开始与类型编译错误,类型转换你的价值提出异议:

(object)DependencyID.Value; 

由于两个数值上的:两侧必须是同一类型的。

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