Insérer une valeur DBNull dans une base de données
On février 9, 2021 by admin Jai du code qui fonctionne plutôt bien. Jai juste besoin de vos opinions sur la façon de mieux lécrire avec moins de lignes de code. Je veux utiliser un opérateur ternaire mais je nai pas pu le faire fonctionner, alors jai fait un if else
à la place.
Fondamentalement, je veux insérer un prix sur mon base de données. La colonne de prix est une décimale Nullable. Même dans mon code C #, elle est également une décimale 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;
Cela peut-il être écrit sans else
block?
Commentaires
- Pourquoi ne pas vous simplifier la vie et utiliser un ORM? " si vous écrivez du code ADO.Net à la main, vous volez votre employeur ou client. "
- @BCdotWEB Comme quelques codeurs ont commenté ce message, si les gens suivaient ce conseil, nous ne ' Je nai pas tous ces jolis ORM. Parfois, le faire à lancienne et de manière artisanale est la meilleure façon dapprendre – nous apprenons les difficultés et découvrons les problèmes que nous devons résoudre.
Réponse
Tout ce que vous avez à faire est dutiliser ?:
(opérateur ternaire ) :
new SqlParameter("@Price", items.Price == null ? DBNull.Value : (object)items.Price)
Vous pouvez également lui écrire une extension:
public static object PriceOrDefault(this ItemsType items) { return items.Price == null ? DBNull.Value : (object)items.Price; }
et utilisez-le à la place:
new SqlParameter("@Price", items.PriceOrDefault())
Il savère que le Price
est un decimal?
, vous pouvez donc envisager dutiliser la propriété HasValue
et permuter les valeurs:
items.Price.HasValue ? (object)items.Price : DBNull.Value;
Je trouve que cela semble mieux que la vérification de null.
Commentaires
- Désolé , mais jai une ligne ondulée en dessous. s15.postimg.org/xmy26aduz/werw.png
- @DikongPrigm Placez-le simplement sur
object
. Jai édité les exemples.SqlParameter
le dépasse de toute façon. - Cela fonctionne. Merci. Je vais envelopper cela dans la méthode dextension. Merci
- Si vous utilisez la méthode helper, je ' opter pour la méthode plus générale
object NulltoDBNull(object o) { return o != null ? o : DBNull.Value; }
.
Réponse
La manière la plus concise et déclarative décrire ceci est dutiliser C # « s ??
. Votre ligne devient:
new SqlParameter("@Price", (object)items.Price ?? DbNull.Value),
Lexpression ici renverra soit la valeur non nulle de lopérande gauche (items.Price
), ou renvoyez lopérande vers la droite à la place.
Si vous naviez pas deviné, lopérateur ??
est fondamentalement du sucre syntaxique pour if operl != null ? operl : operr
.
Commentaires
- sympa, je connais aussi celui-ci mais je ' ne pensais pas que cela fonctionnerait comme ceci avec un nullable: -]
- Lutilisation de la fusion nulle est certainement loption la plus propre.
Réponse
Cest une question de goût personnel, mais si vous descendez le e méthode xtension route suggérée par t3chb0t , jenvisagerais de la rendre générique afin que vous puissiez la réutiliser pour nimporte quel futur Nullable
les types que vous pourriez utiliser et vous ne vous retrouvez pas avec un tas de fonctions très similaires pour différents champs. Quelque chose comme ceci:
public static object DbValueOrNull<T>(this T? value) where T : struct { return value.HasValue ? (object)value.Value : DBNull.Value; }
Permettrait:
new SqlParameter("@Price", items.Price.DbValueOrNull()) new SqlParameter("@SomeOtherNullableVar", items.SomeOtherNullableVar.DbValueOrNull())
etc.
Commentaires
- wow, je crois que je ' n’ai jamais eu l’idée d’utiliser le nullable
?
sur unT
+struct
; -)
Réponse
Avez-vous jeté un coup dœil au System.Data .SqlTypes namespace – en particulier SqlDecimal ?
En vous basant sur certaines des autres réponses, vous pouvez utiliser SqlDecimal
et lopérateur ??
comme suit:
new SqlParameter("@Price", items.Price ?? SqlDecimal.Null),
Laisser un commentaire