DBNull-érték beszúrása egy adatbázisba
On február 9, 2021 by admin Van egy kódom, ami nagyon jól működik. Csak néhány véleményemre lenne szükségem arról, hogyan lehetne kevesebb kódsorral jobban megírni. Háromfázisú operátort akarok használni, de nem tudtam működni, ezért csináltam egy if else
-t.
Alapvetően árat szeretnék beszúrni a adatbázis. Az ár oszlop egy nullázható tizedes. Még a C # kódomban is nullázható tizedes.
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;
Írható ez a else
blokk?
Megjegyzések
- Miért ne könnyítené meg az életet és használna ORM-et? " ha kézzel írsz ADO.Net kódot, ellopod a munkáltatódtól vagy az ügyfeledtől. "
- @BCdotWEB Mivel néhány odakódoló kommentálta ezt a bejegyzést, ha az emberek betartanák ezt a tanácsot, nem fogunk ' Nincsenek ezek a csinos ORM-ek. Néha a régi, kézműves módszerrel lehet a legjobban tanulni – megismerjük a nehézségeket és felfedezzük, milyen problémákat kell megoldanunk.
Válasz
Csak annyit kell tennie, hogy használja a ?:
(ternáris operátor ) :
new SqlParameter("@Price", items.Price == null ? DBNull.Value : (object)items.Price)
Alternatív megoldásként írhat hozzá bővítményt is:
public static object PriceOrDefault(this ItemsType items) { return items.Price == null ? DBNull.Value : (object)items.Price; }
és használja helyette:
new SqlParameter("@Price", items.PriceOrDefault())
Amint kiderült, a Price
egy decimal?
, ezért fontolja meg a HasValue
tulajdonság használatát és az értékek cseréjét:
items.Price.HasValue ? (object)items.Price : DBNull.Value;
Úgy találom, hogy ez jobban néz ki, mint a null-check.
Megjegyzések
- Sajnálom , de kapkodott egy vonalat alatta. s15.postimg.org/xmy26aduz/werw.png
- @DikongPrigm Csak helyezze át
object
. Szerkesztettem a példákat.SqlParameter
amúgy is várja. - Ez működik .. Köszönöm. Ezt kiterjesztem a kiterjesztési módszerre. Köszönöm
- Ha a segítő módszerrel jár, akkor én ' inkább az általánosabb
object NulltoDBNull(object o) { return o != null ? o : DBNull.Value; }
.
Válasz
Ennek legszorosabb és legmeghatározóbb módja a C # “s ??
operátor. A sorod:
new SqlParameter("@Price", (object)items.Price ?? DbNull.Value),
Az itt található kifejezés vagy a bal operandus nem null értékét adja vissza (items.Price
), vagy térjen vissza jobbra az operandusra.
Ha még nem sejtette, a ??
operátor alapvetően szintaktikus cukor, ha operl != null ? operl : operr
.
Hozzászólások
- kedves, én is ismerem ezt de nem gondolta, hogy
nem gondolja, hogy ez egy nullálhatóval így fog működni: -]
Válasz
Ez személyes ízlésnek felel meg, de ha mégis lemegy az e A t3chb0t által javasolt xtension módszer útvonala , fontolóra venném, hogy általánosabbá tegyem, hogy újból felhasználhassa bármilyen későbbi célra. > típusok, amelyeket használhat, és nem ér véget egy csomó nagyon hasonló kinézetű funkcióval a különböző területeken. Valami ilyesmi:
public static object DbValueOrNull<T>(this T? value) where T : struct { return value.HasValue ? (object)value.Value : DBNull.Value; }
Engedélyezné:
new SqlParameter("@Price", items.Price.DbValueOrNull()) new SqlParameter("@SomeOtherNullableVar", items.SomeOtherNullableVar.DbValueOrNull())
stb.
Megjegyzések
- hú, azt hiszem, ' még soha nem jöttem az ötlettel a használatára nullable
?
aT
+struct
; -)
Válasz
Megnézte a System.Data .SqlTypes névtér – különösen SqlDecimal ?
A többi válaszra építve használhatja a SqlDecimal
és a ??
operátor az alábbiak szerint:
new SqlParameter("@Price", items.Price ?? SqlDecimal.Null),
Vélemény, hozzászólás?