C # ADO.NET: Nullen und DbNull - gibt es effizientere Syntax?
Habe ich eine DateTime?
dass ich versuche, einfügen in ein Feld mit einer DbParameter
. Ich bin momentan dabei die parameter wie folgt:
DbParameter datePrm = updateStmt.CreateParameter();
datePrm.ParameterName = "@change_date";
Und dann will ich den Wert der DateTime?
in die dataPrm.Value
während Kontoführung für null
s.
Dachte ich zunächst, ich wäre schlau:
datePrm.Value = nullableDate ?? DBNull.Value;
aber das schlägt fehl mit der Fehlermeldung
Operator '??' angewendet werden kann nicht auf Operanden vom Typ " System.DateTime?' und 'System.DBNull'
Also ich denke, das funktioniert nur, wenn das zweite argument eine null-version des ersten Arguments. So dann ging ich für:
datePrm.Value = nullableDate.HasValue ? nullableDate.Value : DBNull.Value;
aber das funktioniert auch nicht:
Typ des bedingten Ausdrucks kann nicht bestimmt werden, denn es gibt keine implizite Konvertierung zwischen " System.DateTime " und " System.DBNull'
Aber ich will nicht, um die Konvertierung zwischen diesen Typen!
Bisher das einzige, was ich bekommen kann, zu arbeiten:
if (nullableDate.HasValue)
datePrm.Value = nullableDate.Value;
else
datePrm.Value = DBNull.Value;
Ist das wirklich die einzige Art, wie ich schreiben kann? Gibt es einen Weg, um einen one-liner mit dem ternären operator zu arbeiten?
Update: ich nicht wirklich, warum????? version nicht funktioniert. MSDN sagt:
????? operator gibt den linken Operanden, wenn es nicht null ist, oder aber es gibt den rechten Operanden.
Das ist genau das, was ich will!!!
Update2: Gut, es war ziemlich offensichtlich am Ende:
datePrm.Value = nullableDate ?? (object)DBNull.Value;
InformationsquelleAutor der Frage Stewart Johnson | 2008-10-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ah ha! Ich fand eine noch leistungsfähigere Lösung als @Trebz!
InformationsquelleAutor der Antwort Stewart Johnson
Wenn Sie mit C# 3.0 können Sie erstellen, die eine Erweiterung Methode um dies zu tun einfach:
InformationsquelleAutor der Antwort Pop Catalin
Es funktionieren würde, wenn Sie verwendet
InformationsquelleAutor der Antwort dnolan
Wenn Sie mithilfe von SQL Server, die
System.Data.SqlTypes
- namespace enthält einige utility-Klassen, vermeiden Sie die lästige Typumwandlung. Zum Beispiel anstatt diesen:können Sie schreiben:
InformationsquelleAutor der Antwort Gian Marco Gherardi
Ich denke, dass die Fehler mit deinem zweiten Versuch ist aufgrund nullableDate.Wert und DBNull.Wert verschiedenen Arten und der ternäre operator benötigen, um abholen eine Art Rückkehr in beiden Fällen. Ich habe nicht die Umwelt, um dies zu testen, aber ich denke, das sollte für Sie arbeiten:
InformationsquelleAutor der Antwort Dan
Den Weg, dass ich es mache, ist, ich habe eine statische utility-Klasse, die gerade geht durch und prüft, ob der Wert des Parameters null ist, dann setze ich den Wert für DBNull. Ich glaube einfach, dass, bevor ich den Anruf Auszuführen.
InformationsquelleAutor der Antwort Darren Kopp