Vkládání hodnoty DBNull do databáze
On 9 února, 2021 by admin Mám kód, který funguje docela dobře. Potřebuji jen některé vaše názory na to, jak to napsat lépe s menším počtem řádků kódu. Chci použít ternární operátor, ale nemohl jsem, aby to fungovalo, takže jsem místo toho udělal if else
.
V zásadě chci vložit cenu na můj databáze. Sloupec ceny má desetinnou hodnotu s možnou hodnotou Null. I v mém kódu C # je také „desetinnou hodnotu s možnou hodnotou Null.
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;
Lze to napsat bez else
blok?
Komentáře
- Proč neusnadnit život a použít ORM? " pokud píšete kód ADO.Net ručně, kradete od svého zaměstnavatele nebo klienta. "
- @BCdotWEB Jak několik kodérů komentovalo tento příspěvek, pokud by se lidé touto radou řídili, ' Nemám všechny ty hezké ORM venku. Někdy je nejlepší se učit starým, řemeslným způsobem – učíme se o problémech a objevujeme, jaké problémy musíme vyřešit.
Odpovědět
Jediné, co musíte udělat, je použít ?:
(ternární operátor) ) :
new SqlParameter("@Price", items.Price == null ? DBNull.Value : (object)items.Price)
Alternativně k tomu můžete napsat příponu:
public static object PriceOrDefault(this ItemsType items) { return items.Price == null ? DBNull.Value : (object)items.Price; }
a použijte jej místo:
new SqlParameter("@Price", items.PriceOrDefault())
Jak se ukazuje, Price
je decimal?
, takže můžete zvážit použití vlastnosti HasValue
a vyměnit hodnoty:
items.Price.HasValue ? (object)items.Price : DBNull.Value;
Zjistil jsem, že to vypadá lépe než kontrola nuly.
Komentáře
- Omlouváme se , ale mám pod sebou klikatou čáru. s15.postimg.org/xmy26aduz/werw.png
- @DikongPrigm Prostě jej odstraňte na
object
. Upravil jsem příklady.SqlParameter
to stejně očekává. - Funguje to … Děkuji. Zabalím to na metodu rozšíření. Děkuji
- Pokud půjdete s pomocnou metodou, raději půjdu becnější
object NulltoDBNull(object o) { return o != null ? o : DBNull.Value; }
'.
Odpověď
Nejstručnějším a nejvyhlášenějším způsobem, jak to napsat, je použít C # „s ??
operátor. Váš řádek se stává:
new SqlParameter("@Price", (object)items.Price ?? DbNull.Value),
Výraz zde vrátí buď nenulovou hodnotu levého operandu (items.Price
) nebo místo toho operand vraťte doprava.
Pokud jste to neuhodli, operátor ??
je v podstatě syntaktický cukr pro if operl != null ? operl : operr
.
Komentáře
- pěkný, vlastně ho také znám ale ' si nemyslel, že by to fungovalo takto s možnou hodnotou Null: -]
- Použití nulového splynutí je rozhodně nejčistší možností.
Odpověď
Je to na osobním vkusu, ale pokud jdete dolů Trasa metody xtension navržená t3chb0t , uvažuji o její genericitě, abyste ji mohli znovu použít pro jakoukoli budoucí Nullable
typy, které byste mohli použít, a neskončí to spousta velmi podobných funkcí pro různá pole. Něco takového:
public static object DbValueOrNull<T>(this T? value) where T : struct { return value.HasValue ? (object)value.Value : DBNull.Value; }
Umožní:
new SqlParameter("@Price", items.Price.DbValueOrNull()) new SqlParameter("@SomeOtherNullableVar", items.SomeOtherNullableVar.DbValueOrNull())
atd.
Komentáře
- Páni, věřím, že jsem ' nikdy nepřijel s nápadem použít nullable
?
naT
+struct
; -)
Odpověď
Prohlédli jste si System.Data Obor názvů .SqlTypes – zejména SqlDecimal ?
Na základě některých dalších odpovědí můžete použít SqlDecimal
a operátor ??
takto:
new SqlParameter("@Price", items.Price ?? SqlDecimal.Null),
Napsat komentář