Einfügen eines DBNull-Werts in eine Datenbank
On Februar 9, 2021 by admin Ich habe Code, der ziemlich gut funktioniert. Ich brauche nur einige Ihrer Meinungen darüber, wie man es mit weniger Codezeilen besser schreibt. Ich möchte einen ternären Operator verwenden, aber ich konnte ihn nicht zum Laufen bringen, also habe ich stattdessen eine if else
ausgeführt.
Grundsätzlich möchte ich einen Preis für meine eingeben Datenbank. Die Preisspalte ist eine nullbare Dezimalstelle. Auch in meinem C # -Code ist sie „eine nullbare Dezimalstelle.
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;
Kann dies ohne die else
Block?
Kommentare
- Warum nicht das Leben leichter machen und ein ORM verwenden? " Wenn Sie ADO.Net-Code von Hand schreiben, stehlen Sie von Ihrem Arbeitgeber oder Kunden. "
- @BCdotWEB Da einige Programmierer diesen Beitrag kommentierten, würden wir nicht ' Ich habe nicht all diese hübschen ORMs da draußen. Manchmal ist es am besten, auf die alte, handwerkliche Weise zu lernen – wir lernen die Schwierigkeiten kennen und entdecken, welche Probleme wir lösen müssen.
Antwort
Sie müssen lediglich den ?:
(ternärer Operator) verwenden ) :
new SqlParameter("@Price", items.Price == null ? DBNull.Value : (object)items.Price)
Alternativ können Sie eine Erweiterung dafür schreiben:
public static object PriceOrDefault(this ItemsType items) { return items.Price == null ? DBNull.Value : (object)items.Price; }
und verwenden Sie es stattdessen:
new SqlParameter("@Price", items.PriceOrDefault())
Wie sich herausstellt, ist Price
ist eine decimal?
, daher können Sie die HasValue
-Eigenschaft verwenden und die Werte austauschen:
items.Price.HasValue ? (object)items.Price : DBNull.Value;
Ich finde, das sieht besser aus als die Nullprüfung.
Kommentare
- Entschuldigung , aber ich habe eine schnörkellose Linie darunter. s15.postimg.org/xmy26aduz/werw.png
- @DikongPrigm Passen Sie es einfach an
object
. Ich habe die Beispiele bearbeitet.SqlParameter
erwartet es trotzdem. - Das funktioniert. Danke. Ich werde dies in die Erweiterungsmethode einschließen. Vielen Dank
- Wenn Sie sich für die Hilfsmethode entscheiden, würde ich ' lieber die allgemeinere
object NulltoDBNull(object o) { return o != null ? o : DBNull.Value; }
verwenden.
Antwort
Die knappste und deklarativste Art, dies zu schreiben, ist die Verwendung von ??
-Operator. Ihre Zeile wird zu:
new SqlParameter("@Price", (object)items.Price ?? DbNull.Value),
Der Ausdruck hier gibt entweder den Nicht-Null-Wert des linken Operanden (items.Price
) oder setzen Sie stattdessen den Operanden nach rechts zurück.
Wenn Sie nicht geraten haben, den Operator ??
ist im Grunde syntaktischer Zucker für wenn operl != null ? operl : operr
.
Kommentare
- nett, ich kenne diesen auch Aber ' hätte nicht gedacht, dass dies mit einer Nullable funktionieren würde: -]
- Die Verwendung der Null-Koaleszenz ist definitiv die sauberste Option.
Antwort
Dies hängt vom persönlichen Geschmack ab, aber wenn Sie das e xtension method route , vorgeschlagen von t3chb0t , würde ich in Betracht ziehen, es generisch zu machen, damit Sie es für jede zukünftige Nullable
Typen, die Sie möglicherweise verwenden, und Sie erhalten keine sehr ähnlich aussehenden Funktionen für verschiedene Felder. So etwas in der Art:
public static object DbValueOrNull<T>(this T? value) where T : struct { return value.HasValue ? (object)value.Value : DBNull.Value; }
würde Folgendes ermöglichen:
new SqlParameter("@Price", items.Price.DbValueOrNull()) new SqlParameter("@SomeOtherNullableVar", items.SomeOtherNullableVar.DbValueOrNull())
usw. P. >
Kommentare
- Wow, ich glaube, ich ' bin nie auf die Idee gekommen, das zu verwenden nullable
?
auf einemT
+struct
; -)
Antwort
Haben Sie sich die System.Data angesehen .SqlTypes -Namespace – insbesondere SqlDecimal ?
Aufbauend auf einigen anderen Antworten können Sie und der Operator ??
wie folgt:
new SqlParameter("@Price", items.Price ?? SqlDecimal.Null),
Schreibe einen Kommentar