Infoga ett DBNull-värde i en databas
On februari 9, 2021 by admin Jag har kod som fungerar ganska bra. Jag behöver bara några av dina åsikter om hur man skriver det bättre med färre kodrader. Jag vill använda en ternär operatör men jag kunde inte få det att fungera så jag gjorde en if else
istället.
I grund och botten vill jag infoga ett pris på min priskolumnen är en ogiltig decimal. Även i min C # -kod är den ”en ogiltig decimal också.
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 detta skrivas utan else
blockera?
Kommentarer
- Varför inte göra livet enklare och använda en ORM? " om du skriver ADO.Net-kod för hand stjäl du från din arbetsgivare eller klient. "
- @BCdotWEB Eftersom några kodare där ute kommenterade det inlägget, om folk följde det rådet skulle vi inte ' har inte alla dessa vackra ORM där ute. Ibland är det bästa sättet att lära oss att göra det på det gamla, hantverksmässiga sättet – vi lär oss om svårigheterna och upptäcker vilka problem vi behöver lösa.
Svar
Allt du behöver göra är att använda ?:
(ternär operatör ) :
new SqlParameter("@Price", items.Price == null ? DBNull.Value : (object)items.Price)
Alternativt kan du skriva ett tillägg för det:
public static object PriceOrDefault(this ItemsType items) { return items.Price == null ? DBNull.Value : (object)items.Price; }
och använd den istället:
new SqlParameter("@Price", items.PriceOrDefault())
Som det visar sig Price
är en decimal?
så du kan överväga att använda egenskapen HasValue
och byta värden:
items.Price.HasValue ? (object)items.Price : DBNull.Value;
Jag tycker att det här ser bättre ut än nollkontrollen.
Kommentarer
- Ledsen , men jag har en snurrande linje under. s15.postimg.org/xmy26aduz/werw.png
- @DikongPrigm Bara ta det till
object
. Jag redigerade exemplen.SqlParameter
förväntar sig ändå. - Det fungerar .. Tack. Jag kommer att slå in det här på tilläggsmetoden. Tack
- Om du går med hjälpmetoden vill jag ' hellre gå med den mer allmänna
object NulltoDBNull(object o) { return o != null ? o : DBNull.Value; }
.
Svar
Det mest kortfattade och deklarativa sättet att skriva detta är att använda C # ”s ??
operatör. Din rad blir:
new SqlParameter("@Price", (object)items.Price ?? DbNull.Value),
Uttrycket här returnerar antingen det icke-nollvärde för vänster operand (items.Price
), eller returnera operanden till höger istället.
Om du inte hade gissat,
är i grunden syntaktiskt socker för om operl != null ? operl : operr
.
Kommentarer
- trevligt, jag känner faktiskt den här också men trodde inte ' att det skulle fungera så här med ett ogiltigt: -]
- Att använda noll-sammanslagning är definitivt det renaste alternativet.
Svar
Detta beror på personlig smak, men om du gör det xtensionsmetod rutt föreslagen av t3chb0t , jag skulle överväga att göra den generisk så att du kan återanvända den för alla framtida Nullable
typer du kan använda och du slutar inte med en massa mycket liknande funktioner för olika fält. Något som detta:
public static object DbValueOrNull<T>(this T? value) where T : struct { return value.HasValue ? (object)value.Value : DBNull.Value; }
Skulle tillåta:
new SqlParameter("@Price", items.Price.DbValueOrNull()) new SqlParameter("@SomeOtherNullableVar", items.SomeOtherNullableVar.DbValueOrNull())
etc.
Kommentarer
- wow, jag tror att jag ' aldrig har kommit på idén att använda ogiltig
?
på enT
+struct
; -)
Svar
Har du tittat på System.Data .SqlTypes namnområde – särskilt SqlDecimal ?
Om du bygger på några av de andra svaren kan du använda SqlDecimal
och operatorn ??
enligt följande:
new SqlParameter("@Price", items.Price ?? SqlDecimal.Null),
Lämna ett svar