2011-06-30 32 views
1

が、私はそうのようなパラメータを初期化します。_DependencyID場合クラス挿入()メソッドでcmd.Parameters.AddWithValue NULL可能int型

private int? _DependencyID; 

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

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

、私は

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

をしようとしています価値があり、すべてが順調です。 _DependencyIDがnullの場合、私はエラーを取得:

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はボクシングとunboxingの世話をする? – Bengal

+0

お世話になりました皆さん、ありがとうございました.... SLakの答えは私のところに飛び出しました。すべてありがとうございました – Bengal

+0

@Bengal:いいえ、式がどのような型かをコンパイラに伝えるためにはキャストが必要です。 – SLaks

0

AFAIC、ADO.NET/SQLはNULL可能タイプをこのようにサポートしていません。

最後の例は私にとって正しいと思われます。どのような問題がありますか?あなただけのタイプに関連するコンパイルエラーを取得している場合は、型がobjectにあなたの価値をキャスト:

(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); 
関連する問題