DBNull-arvon lisääminen tietokantaan
On helmikuu 9, 2021 by admin Minulla on koodi, joka toimii melko hyvin. Tarvitsen vain joitain mielipiteitäsi siitä, kuinka kirjoittaa se paremmin vähemmän koodirivillä. Haluan käyttää kolmiportaista operaattoria, mutta en voinut saada sitä toimimaan, joten tein sen sijaan if else
.
Pohjimmiltaan haluan lisätä hinnan hintasarake on mitätöitävä desimaali. Jopa C # -koodissani se on myös tyhjä desimaali.
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;
Voiko tämän kirjoittaa ilman else
esto?
Kommentit
- Miksi et helpottaisi elämää ja käytä ORM: ää? " jos kirjoitat ADO.Net-koodia käsin, varastat työnantajalta tai asiakkaalta. "
- @BCdotWEB Koska muutama kooderi siellä kommentoi viestiä, jos ihmiset noudattavat kyseisiä neuvoja, emme ' minulla ei ole kaikkia näitä kauniita ORM: itä. Joskus tekeminen vanhalla, käsityönä on paras tapa oppia – opimme vaikeuksista ja löydämme, mitä ongelmia meidän on ratkaistava.
Vastaa
Sinun tarvitsee vain käyttää ?:
(kolminkertainen operaattori ) :
new SqlParameter("@Price", items.Price == null ? DBNull.Value : (object)items.Price)
Vaihtoehtoisesti voit kirjoittaa sille laajennuksen:
public static object PriceOrDefault(this ItemsType items) { return items.Price == null ? DBNull.Value : (object)items.Price; }
ja käytä sitä sen sijaan:
new SqlParameter("@Price", items.PriceOrDefault())
Kuten käy ilmi, Price
on decimal?
, joten voit harkita HasValue
-ominaisuuden käyttöä ja vaihtaa arvot:
items.Price.HasValue ? (object)items.Price : DBNull.Value;
Minusta tämä näyttää paremmalta kuin nollatarkastus.
Kommentit
- Anteeksi , mutta minulla on mutkikas viiva alla. s15.postimg.org/xmy26aduz/werw.png
- @DikongPrigm Cust it just to
object
. Muokkasin esimerkkejä.SqlParameter
odottaa sitä joka tapauksessa. - Se toimii .. Kiitos. Käärin tämän laajennusmenetelmään. Kiitos
- Jos valitset auttajamenetelmän, minä ' haluan mieluummin käyttää yleisempää
object NulltoDBNull(object o) { return o != null ? o : DBNull.Value; }
.
vastaus
Kaikkein tiukin ja selkein tapa kirjoittaa tämä on käyttää C # ”s ??
-operaattori. Rivistä tulee:
new SqlParameter("@Price", (object)items.Price ?? DbNull.Value),
Tässä oleva lauseke joko palauttaa vasemman operandin (items.Price
) tai palauta operandi sen sijaan oikealle.
Jos et olisi arvannut, operaattori ??
on pohjimmiltaan syntaktinen sokeri if operl != null ? operl : operr
.
Kommentit
- mukava, tunnen myös tämän mutta ei ' usko, että se toimisi tällä tavoin nollattavan kanssa: -]
- Nollan yhdistämisen käyttö on ehdottomasti puhtain vaihtoehto.
Vastaa
Tämä johtuu henkilökohtaisesta mausta, mutta jos menet xtension method -reitti jonka ehdotti t3chb0t , harkitsisin sen tekemistä yleiseksi, jotta voit käyttää sitä uudelleen tulevaisuuden kannalta Nullable
tyypit, joita saatat käyttää, et pääse joukolle hyvin samanlaisia näköisiä toimintoja eri kentille. Jotain tältä:
public static object DbValueOrNull<T>(this T? value) where T : struct { return value.HasValue ? (object)value.Value : DBNull.Value; }
Sallisi:
new SqlParameter("@Price", items.Price.DbValueOrNull()) new SqlParameter("@SomeOtherNullableVar", items.SomeOtherNullableVar.DbValueOrNull())
jne.
Kommentit
- wow, uskon, että en ' ole koskaan keksinyt ajatusta käyttää tyhjä
?
T
+struct
; -)
Vastaus
Oletko katsonut -järjestelmää. .SqlTypes nimiavaruus – erityisesti SqlDecimal ?
Joidenkin muiden vastausten pohjalta voit käyttää SqlDecimal
ja ??
-operaattori seuraavasti:
new SqlParameter("@Price", items.Price ?? SqlDecimal.Null),
Vastaa