2011-06-30 39 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);