Concise Nutzung von DBNull? (Ternary?)
-
27-09-2019 - |
Frage
Es scheint, dass es eine Art Verwirrung in dem ternären Operator. Ich weiß, dass dies in anderen SO Themen angesprochen worden, aber es ist immer mit nullables gewesen. Auch für meinen Fall bin ich wirklich nur auf der Suche nach einem besseren Weg.
Ich möchte Verwendung der Lage sein,
proc.Parameters[PARAM_ID].Value =
string.IsNullOrEmpty(dest.Id) ? DBNull.Value : dest.Id;
, sondern bin ich mit diesem fest:
if (string.IsNullOrEmpty(dest.Id))
{
proc.Parameters[PARAM_ID].Value = DBNull.Value;
}
else
{
proc.Parameters[PARAM_ID].Value = dest.Id;
}
Der ternäre Operator schlägt fehl, da es keine Konvertierung möglich zwischen DBNull und Schnur, und so dumm wie das scheint angesichts Wert des Objekts ist der Compiler Kicks es mir zurück, und ich bin zu Pflege gezwungen. Die Antwort auf die Nullable-Version dieser Frage ist nur null String gegossen und mit ihm getan werden; DBNull kann nicht auf Zeichenfolge gegossen werden, obwohl, so kein Glück gibt.
Gibt es eine prägnante Art und Weise, dies zu tun (ohne nullables zu verwenden, übrigens?)
Danke!
Lösung
Sie können Ihre erste Aussage ändern:
proc.Parameters[PARAM_ID].Value =
string.IsNullOrEmpty(dest.Id) ? (object)DBNull.Value : dest.Id;
Andere Tipps
Die Value
Eigenschaft ist vom Typ object
, so dass Sie object
werfen sollten, nicht string
:
proc.Parameters[PARAM_ID].Value = string.IsNullOrEmpty(dest.Id)
? (object)DBNull.Value
: (object)dest.Id;
Oder Sie könnten eine Erweiterungsmethode hinzufügen, wie zum Beispiel:
public static class DBNullExtensions
{
public static object AsDBNullIfEmpty(this string value)
{
if (String.IsNullOrEmpty(value))
{
return DBNull.Value;
}
return value;
}
}
Und dann könnte man einfach sagen:
proc.Parameters[PARAM_ID].Value = dest.Id.AsDBNullIfEmpty();
(Angepasst von Phil Haack )
Lesbare und prägnant, nicht wahr?
Was ist die Verwendung von ?? Null-Koaleszenz Operator Mehr Details über ?? Operator
proc.Parameters[PARAM_ID].Value = dest.Id ?? (object)DBNull.Value;