Indsættelse af en DBNull-værdi i en database
On februar 9, 2021 by admin Jeg har kode, der fungerer ret godt. Jeg har bare brug for nogle af dine meninger om, hvordan man skriver det bedre med færre kodelinjer. Jeg vil bruge en ternær operatør, men jeg kunne ikke få det til at fungere, så jeg gjorde en if else
i stedet.
Dybest set vil jeg indsætte en pris på min Priskolonnen er en nulbar decimal. Selv i min C #-kode er den også en nul decimal.
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 dette skrives uden else
blok?
Kommentarer
- Hvorfor ikke gøre livet lettere og bruge en ORM? " Hvis du skriver ADO.Net-kode manuelt, stjæler du fra din arbejdsgiver eller klient. "
- @BCdotWEB Da nogle få kodere derude kommenterede dette indlæg, hvis folk fulgte det råd, ville vi ikke ' t har alle de smukke ORMer derude. Nogle gange er det den bedste måde at lære at gøre det på den gamle, håndværksmæssige måde – vi lærer om vanskelighederne og opdager, hvilke problemer vi skal løse.
Svar
Alt du skal gøre er at bruge ?:
(ternær operatør ) :
new SqlParameter("@Price", items.Price == null ? DBNull.Value : (object)items.Price)
Alternativt kan du skrive en udvidelse til den:
public static object PriceOrDefault(this ItemsType items) { return items.Price == null ? DBNull.Value : (object)items.Price; }
og brug det i stedet:
new SqlParameter("@Price", items.PriceOrDefault())
Som det viser sig, at Price
er en decimal?
så du kan overveje at bruge egenskaben HasValue
og bytte værdier:
items.Price.HasValue ? (object)items.Price : DBNull.Value;
Jeg finder ud af, at dette ser bedre ud end null-check.
Kommentarer
- Undskyld , men jeg fik en snoet linje nedenunder. s15.postimg.org/xmy26aduz/werw.png
- @DikongPrigm Just cust it to
object
. Jeg redigerede eksemplerne.SqlParameter
undgår det alligevel. - Det fungerer .. Tak. Jeg pakker dette ind i udvidelsesmetoden. Tak
- Hvis du følger hjælpemetoden, går jeg ' hellere med den mere generelle
object NulltoDBNull(object o) { return o != null ? o : DBNull.Value; }
.
Svar
Den mest kortfattede og deklarative måde at skrive dette på er at bruge C # “s ??
operator. Din linje bliver:
new SqlParameter("@Price", (object)items.Price ?? DbNull.Value),
Udtrykket her vil enten returnere den ikke-nulværdi af den venstre operand (items.Price
), eller returner operanden til højre i stedet.
Hvis du ikke havde gættet,
er dybest set syntaktisk sukker for hvis operl != null ? operl : operr
.
Kommentarer
- dejligt, jeg kender faktisk denne også men troede ikke ' at det ville fungere som dette med en nulbar: -]
- Brug af nul coalescing er bestemt den reneste mulighed.
Svar
Dette skyldes personlig smag, men hvis du går ned e udvidelsesmetode rute foreslået af t3chb0t , jeg overvejer at gøre det generisk, så du kan genbruge det til enhver fremtid Nullable
typer, du muligvis bruger, og du ender ikke med en masse meget lignende funktioner til forskellige felter. Noget som dette:
public static object DbValueOrNull<T>(this T? value) where T : struct { return value.HasValue ? (object)value.Value : DBNull.Value; }
Vil tillade:
new SqlParameter("@Price", items.Price.DbValueOrNull()) new SqlParameter("@SomeOtherNullableVar", items.SomeOtherNullableVar.DbValueOrNull())
osv.
Kommentarer
- wow, jeg tror, at jeg ' aldrig er kommet på ideen om at bruge ugyldig
?
på enT
+struct
; -)
Svar
Har du kigget på System.Data .SqlTypes navneområde – især SqlDecimal ?
Hvis du bygger på nogle af de andre svar, kan du bruge SqlDecimal
og ??
operatoren som følger:
new SqlParameter("@Price", items.Price ?? SqlDecimal.Null),
Skriv et svar