Een DBNull-waarde invoegen in een database
Geplaatst op februari 9, 2021 door admin Ik heb code die redelijk goed werkt. Ik heb alleen wat van je mening nodig over hoe je het beter kunt schrijven met minder regels code. Ik wil een ternaire operator gebruiken, maar ik kon het niet laten werken, dus heb ik in plaats daarvan een if else
gedaan.
In feite wil ik een prijs invoegen op mijn database. De prijskolom is een nullable decimaal. Zelfs in mijn C # -code is het ook “een nullable decimaal.
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;
Kan dit worden geschreven zonder de else
block?
Reacties
- Waarom zou je het leven niet gemakkelijker maken en een ORM gebruiken? " als je ADO.Net-code met de hand schrijft, steel je van je werkgever of klant. "
- @BCdotWEB Aangezien een paar programmeurs daar commentaar op hebben gegeven, als mensen dat advies zouden opvolgen, zouden we ' Ik heb niet al die mooie ORMs die er zijn. Soms is het op de oude, ambachtelijke manier de beste manier om te leren – we leren over de moeilijkheden en ontdekken welke problemen we moeten oplossen.
Antwoord
Het enige dat u hoeft te doen is de ?:
(ternaire operator ) :
new SqlParameter("@Price", items.Price == null ? DBNull.Value : (object)items.Price)
U kunt er ook een extensie voor schrijven:
public static object PriceOrDefault(this ItemsType items) { return items.Price == null ? DBNull.Value : (object)items.Price; }
en gebruik het in plaats daarvan:
new SqlParameter("@Price", items.PriceOrDefault())
Het blijkt dat de Price
is een decimal?
, dus u kunt overwegen de eigenschap HasValue
te gebruiken en de waarden om te wisselen:
items.Price.HasValue ? (object)items.Price : DBNull.Value;
Ik vind dat dit er beter uitziet dan de nulcontrole.
Reacties
- Sorry , maar ik heb een kronkelige lijn eronder. s15.postimg.org/xmy26aduz/werw.png
- @DikongPrigm Pas het gewoon aan
object
. Ik heb de voorbeelden bewerkt.SqlParameter
verwacht het toch. - Dat werkt .. Bedankt. Ik zal dit verpakken in de uitbreidingsmethode. Dank je.
- Als je voor de helper-methode kiest, ga ik ' liever voor de meer algemene
object NulltoDBNull(object o) { return o != null ? o : DBNull.Value; }
.
Answer
De meest beknopte en declaratieve manier om dit te schrijven is door C # “s ??
operator. Uw regel wordt:
new SqlParameter("@Price", (object)items.Price ?? DbNull.Value),
De uitdrukking hier retourneert ofwel de niet-nulwaarde van de linker operand (items.Price
), of retourneer de operand naar rechts.
Als je het nog niet had geraden, de ??
operator is eigenlijk syntactisch suiker voor if operl != null ? operl : operr
.
Reacties
- leuk, ik ken deze eigenlijk ook maar ' dacht niet dat het zo zou werken met een nullable: -]
- Het gebruik van null-coalescing is absoluut de schoonste optie.
Antwoord
Dit heeft te maken met persoonlijke smaak, maar als je de e xtension method route voorgesteld door t3chb0t , zou ik “overwegen om het generiek te maken, zodat je het opnieuw kunt gebruiken voor elke toekomstige Nullable
typen die u zou kunnen gebruiken en u zult niet eindigen met een heleboel sterk op elkaar lijkende functies voor verschillende velden. Iets als dit:
public static object DbValueOrNull<T>(this T? value) where T : struct { return value.HasValue ? (object)value.Value : DBNull.Value; }
Zou toestaan:
new SqlParameter("@Price", items.Price.DbValueOrNull()) new SqlParameter("@SomeOtherNullableVar", items.SomeOtherNullableVar.DbValueOrNull())
enz.
Reacties
- wauw, ik geloof dat ik ' nooit op het idee ben gekomen om de nullable
?
op eenT
+struct
; -)
Antwoord
Heb je de System.Data bekeken .SqlTypes naamruimte – in het bijzonder SqlDecimal ?
Voortbouwend op enkele van de andere antwoorden, kunt u SqlDecimal
en de ??
operator als volgt:
new SqlParameter("@Price", items.Price ?? SqlDecimal.Null),
Geef een reactie