Sette inn en DBNull-verdi i en database
On februar 9, 2021 by admin Jeg har kode som fungerer ganske bra. Jeg trenger bare noen av meningene dine om hvordan du skriver det bedre med færre kode. Jeg vil bruke en ternær operatør, men jeg kunne ikke få det til å fungere, så jeg gjorde en if else
i stedet.
I utgangspunktet vil jeg sette inn en pris på Priskolonnen er en nullbar desimal. Selv i C # -koden min er den også en nullbar desimal.
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 uten else
blokker?
Kommentarer
- Hvorfor ikke gjøre livet lettere og bruke en ORM? " Hvis du skriver ADO.Net-kode for hånd, stjeler du fra din arbeidsgiver eller klient. "
- @BCdotWEB Som noen få kodere der ute kommenterte det innlegget, hvis folk fulgte det rådet, ville vi ikke ' t har alle de pene ORMene der ute. Noen ganger er det den beste måten å lære å gjøre det på den gamle, håndverksmessige måten – vi lærer om vanskelighetene og oppdager hvilke problemer vi trenger å løse.
Svar
Alt du trenger å gjøre er å bruke ?:
(ternary operator ) :
new SqlParameter("@Price", items.Price == null ? DBNull.Value : (object)items.Price)
Alternativt kan du skrive en utvidelse for den:
public static object PriceOrDefault(this ItemsType items) { return items.Price == null ? DBNull.Value : (object)items.Price; }
og bruk den i stedet:
new SqlParameter("@Price", items.PriceOrDefault())
Som det viser seg at Price
er en decimal?
, så du kan vurdere å bruke egenskapen HasValue
og bytte verdiene:
items.Price.HasValue ? (object)items.Price : DBNull.Value;
Jeg synes dette ser bedre ut enn nullkontrollen.
Kommentarer
- Beklager , men jeg fikk en vriende linje under. s15.postimg.org/xmy26aduz/werw.png
- @DikongPrigm Bare ta det til
object
. Jeg redigerte eksemplene.SqlParameter
forventer det uansett. - Det fungerer .. Takk. Jeg vil pakke dette inn i utvidelsesmetoden. Takk
- Hvis du går med hjelpemetoden, vil jeg ' heller gå med den mer generelle
object NulltoDBNull(object o) { return o != null ? o : DBNull.Value; }
.
Svar
Den mest kortfattede og deklarative måten å skrive dette på er å bruke C # «s ??
operator. Linjen din blir:
new SqlParameter("@Price", (object)items.Price ?? DbNull.Value),
Uttrykket her vil enten returnere den ikke-nullverdien til venstre operand (items.Price
), eller returner operanden til høyre i stedet.
Hvis du ikke hadde gjettet, operatøren ??
er i utgangspunktet syntaktisk sukker for hvis operl != null ? operl : operr
.
Kommentarer
- fin, jeg vet faktisk denne også men trodde ikke ' at det ville fungere som dette med en nullbar: -]
- Å bruke null koalescing er absolutt det reneste alternativet.
Svar
Dette skyldes personlig smak, men hvis du går ned e utvidelsesmetode rute foreslått av t3chb0t , jeg vil vurdere å gjøre den generisk slik at du kan bruke den til enhver fremtid Nullable
typer du kan bruke, og du vil ikke ende opp med en haug med veldig like funksjoner for forskjellige felt. Noe som dette:
public static object DbValueOrNull<T>(this T? value) where T : struct { return value.HasValue ? (object)value.Value : DBNull.Value; }
Vil tillate:
new SqlParameter("@Price", items.Price.DbValueOrNull()) new SqlParameter("@SomeOtherNullableVar", items.SomeOtherNullableVar.DbValueOrNull())
osv.
Kommentarer
- wow, jeg tror jeg ' har aldri kommet på ideen om å bruke nullbar
?
på enT
+struct
; -)
Svar
Har du tatt en titt på System.Data .SqlTypes navneområde – spesielt SqlDecimal ?
Hvis du bygger på noen av de andre svarene, kan du bruke SqlDecimal
og operatøren ??
:
new SqlParameter("@Price", items.Price ?? SqlDecimal.Null),
Legg igjen en kommentar