Inserimento di un valore DBNull in un database
Su Febbraio 9, 2021 da admin Ho un codice che funziona abbastanza bene. Ho solo bisogno di alcune delle tue opinioni su come scriverlo meglio con meno righe di codice. Vorrei utilizzare un operatore ternario ma non sono riuscito a farlo funzionare, quindi ho eseguito un if else
.
Fondamentalmente, voglio inserire un prezzo sul mio database. La colonna del prezzo è un decimale nullable. Anche nel mio codice C #, è “anche un decimale nullable.
if (items.Price == null) { SqlParameter[] p = { new SqlParameter("@purchaseorder", items.PurchaseOrderItems), new SqlParameter("@modelnumber", items.ModelNumber), new SqlParameter("@quantity", items.Quantity), new SqlParameter("@Price", DBNull.Value), new SqlParameter("@Description", items.Description), new SqlParameter("@OrderNumber", items.OrderNumber), new SqlParameter("@Unit", items.Unit) }; i = Dal.ExecuteNonQuery(sql,p); } else { SqlParameter[] p = { new SqlParameter("@purchaseorder", items.PurchaseOrderItems), new SqlParameter("@modelnumber", items.ModelNumber), new SqlParameter("@quantity", items.Quantity), new SqlParameter("@Price", items.Price), new SqlParameter("@Description", items.Description), new SqlParameter("@OrderNumber", items.OrderNumber), new SqlParameter("@Unit", items.Unit) }; i = Dal.ExecuteNonQuery(sql,p); } return i;
Può essere scritto senza else
block?
Commenti
- Perché non semplificarti la vita e utilizzare un ORM? " se stai scrivendo il codice ADO.Net a mano, stai rubando al tuo datore di lavoro o cliente. "
- @BCdotWEB Poiché alcuni programmatori là fuori hanno commentato quel post, se le persone seguissero quel consiglio non lo faremmo ' ho tutti quei graziosi ORM là fuori. A volte, farlo alla vecchia maniera artigianale è il modo migliore per imparare: impariamo a conoscere le difficoltà e scopriamo quali problemi dobbiamo risolvere.
Risposta
Tutto quello che devi fare è utilizzare ?:
(operatore ternario ) :
new SqlParameter("@Price", items.Price == null ? DBNull.Value : (object)items.Price)
In alternativa potresti scrivere unestensione per esso:
public static object PriceOrDefault(this ItemsType items) { return items.Price == null ? DBNull.Value : (object)items.Price; }
e usalo invece:
new SqlParameter("@Price", items.PriceOrDefault())
Come risulta il Price
è una decimal?
, quindi potresti prendere in considerazione lutilizzo della proprietà HasValue
e scambiare i valori:
items.Price.HasValue ? (object)items.Price : DBNull.Value;
Trovo che sia migliore del controllo null.
Commenti
- Scusa , ma ho una linea ondulata sotto. s15.postimg.org/xmy26aduz/werw.png
- @DikongPrigm Basta personalizzarlo su
object
. Ho modificato gli esempi.SqlParameter
lo prevede comunque. - Funziona .. Grazie. Lo avvolgerò nel metodo di estensione. Grazie
- Se utilizzi il metodo helper, ' preferirei utilizzare il più generale
object NulltoDBNull(object o) { return o != null ? o : DBNull.Value; }
.
Risposta
Il modo più conciso e dichiarativo per scrivere questo è usare C # “s ??
. La riga diventa:
new SqlParameter("@Price", (object)items.Price ?? DbNull.Value),
Lespressione qui restituirà il valore non nullo delloperando sinistro (items.Price
) o restituisci invece loperando a destra.
Se non hai “indovinato, loperatore ??
è fondamentalmente zucchero sintattico per if operl != null ? operl : operr
.
Commenti
- carino, in realtà conosco anche questo ma ' non pensava che avrebbe funzionato in questo modo con un nullable: -]
- Luso della coalescenza null è sicuramente lopzione più pulita.
Risposta
Questo dipende dai gusti personali, ma se vai giù xtension method route suggerito da t3chb0t , “prenderei in considerazione di renderlo generico in modo che tu possa riutilizzarlo per qualsiasi futuro Nullable
tipi che potresti usare e non ti ritroverai con un mucchio di funzioni dallaspetto molto simile per campi diversi. Qualcosa del genere:
public static object DbValueOrNull<T>(this T? value) where T : struct { return value.HasValue ? (object)value.Value : DBNull.Value; }
consentirebbe:
new SqlParameter("@Price", items.Price.DbValueOrNull()) new SqlParameter("@SomeOtherNullableVar", items.SomeOtherNullableVar.DbValueOrNull())
ecc.
Commenti
- wow, credo di ' non ho mai avuto lidea di utilizzare nullable
?
suT
+struct
; -)
Risposta
Hai dato unocchiata al System.Data .SqlTypes spazio dei nomi, in particolare SqlDecimal ?
Basandosi su alcune delle altre risposte, puoi utilizzare SqlDecimal
e ??
come segue:
new SqlParameter("@Price", items.Price ?? SqlDecimal.Null),
Lascia un commento