Introducerea unei valori DBNull într-o bază de date
On februarie 9, 2021 by admin Am cod care funcționează destul de bine. Am nevoie doar de câteva păreri despre cum să scriu mai bine cu mai puține linii de cod. Vreau să folosesc un operator ternar, dar nu l-am putut face să funcționeze, așa că am făcut un if else
.
Practic, vreau să introduc un preț pe baza de date. Coloana de preț este o zecimală nulă. Chiar și în codul meu C #, „este și o zecimală nulă.
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;
Poate fi scris fără else
bloc?
Comentarii
- De ce să nu simplificați viața și să folosiți un ORM? " dacă scrieți codul ADO.Net manual, furați de la angajatorul sau clientul dvs. "
- @BCdotWEB După cum au comentat câțiva codificatori de pe postarea respectivă, dacă oamenii ar urma acel sfat, nu am ' Nu am toate aceste ORM-uri frumoase acolo. Uneori, a face acest lucru vechi, artizanal este cel mai bun mod de a învăța – aflăm despre dificultăți și descoperim ce probleme trebuie să rezolvăm.
Răspuns
Tot ce trebuie să faceți este să utilizați ?:
(operator ternar ) :
new SqlParameter("@Price", items.Price == null ? DBNull.Value : (object)items.Price)
Alternativ, puteți scrie o extensie pentru aceasta:
public static object PriceOrDefault(this ItemsType items) { return items.Price == null ? DBNull.Value : (object)items.Price; }
și folosiți-l în schimb:
new SqlParameter("@Price", items.PriceOrDefault())
După cum se dovedește, Price
este o decimal?
, deci vă recomandăm să utilizați proprietatea HasValue
și să schimbați valorile:
items.Price.HasValue ? (object)items.Price : DBNull.Value;
Mi se pare că arată mai bine decât verificarea nulă.
Comentarii
- Ne pare rău , dar am o linie zgârcită dedesubt. s15.postimg.org/xmy26aduz/werw.png
- @DikongPrigm Doar păstrați-l la
object
. Am editat exemplele.SqlParameter
îl așteaptă oricum. - Asta funcționează .. Mulțumesc. Voi încheia acest lucru cu metoda de extensie. Vă mulțumim
- Dacă mergeți cu metoda de ajutor, ' prefer să merg cu
object NulltoDBNull(object o) { return o != null ? o : DBNull.Value; }
mai general.
Răspuns
Cel mai concis și mai declarativ mod de a scrie acest lucru este să folosiți C # „s ??
operator. Linia dvs. devine:
new SqlParameter("@Price", (object)items.Price ?? DbNull.Value),
Expresia de aici va returna valoarea non-nulă a operandului din stânga (items.Price
) sau întoarceți operandul la dreapta.
Dacă nu ați ghicit, operatorul ??
este în esență zahăr sintactic pentru if operl != null ? operl : operr
.
Comentarii
- drăguț, de fapt îl știu și pe acesta dar nu ' nu credeam că ar funcționa astfel cu un nul: -]
- Utilizarea coalescenței nule este cu siguranță cea mai curată opțiune.
Răspuns
Acest lucru este în funcție de gustul personal, dar dacă mergeți în jos ruta metodei xtension sugerată de t3chb0t , aș considera că este generică, astfel încât să o puteți reutiliza pentru orice viitor Nullable
tipuri pe care le-ați putea folosi și nu veți ajunge cu o grămadă de funcții foarte similare pentru diferite domenii. Ceva ca acesta:
public static object DbValueOrNull<T>(this T? value) where T : struct { return value.HasValue ? (object)value.Value : DBNull.Value; }
Ar permite:
new SqlParameter("@Price", items.Price.DbValueOrNull()) new SqlParameter("@SomeOtherNullableVar", items.SomeOtherNullableVar.DbValueOrNull())
etc.
Comentarii
- wow, cred că ' nu am venit niciodată cu ideea de a folosi anulabil
?
pe unT
+struct
; -)
Răspuns
Ați aruncat o privire asupra sistemului Spațiul de nume .SqlTypes – în special SqlDecimal ?
Pe baza celorlalte răspunsuri, puteți utiliza SqlDecimal
și operatorul ??
după cum urmează:
new SqlParameter("@Price", items.Price ?? SqlDecimal.Null),
Lasă un răspuns