cmd.Parameters.AddWithValue nullable int

Nella mia class del livello dati, inizializzo un parametro in questo modo:

private int? _DependencyID; public int? DependencyID { get {return _DependencyID;} set {_DependencyID = value;} } public ConstructorMethod() { _DependencyID = (int?)null; } 

Nel metodo Insert () della class, sto tentando

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

Se _DependencyID ha un valore, tutto va bene. Se _DependencyID è nullo, ottengo l’errore:

La query parametrizzata ‘(@ param1 (nvarchar (10), @ param2 (nvarchar (255), si aspetta il parametro’ @DependecyID ‘, che non è stato fornito

Ho trovato questo [articolo] [1], quindi ho provato a modificare il codice in questo modo:

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

Ad ogni modo, ci sono problemi. Come dovrei gestirlo?

Grazie in anticipo per qualsiasi aiuto

Devi aggiungere un object :

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

Puoi accorciare a

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

Ho creato un’estensione semplicemente al codice.

 public static class SQLExtension { public static SqlParameter AddWithNullable( this SqlParameterCollection collection, string parameterName, Nullable value) where T : struct, IComparable { return collection.AddWithValue( parameterName, (value.HasValue ? value.Value : (object)DBNull.Value) ); } } 

Ecco come puoi usarlo.

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

AFAIC, ADO.NET/SQL non supporta i tipi nullable in questo modo.

L’ultimo esempio sembra più vicino a correggermi. Che tipo di problemi hai con questo? Se ricevi solo un errore di compilazione relativo ai tipi, inserisci il cast del valore su object:

 (object)DependencyID.Value; 

Poiché entrambi i valori su entrambi i lati di : devono essere dello stesso tipo.