C# DBNull und nullable-Typen - die sauberste form der Umwandlung
Ich habe eine DataTable, die eine Anzahl von Spalten. Einige dieser Spalten null-Werte zulassen.
DataTable dt; //Value set.
DataRow dr; //Value set.
//dr["A"] is populated from T-SQL column defined as: int NULL
Was ist dann die reinste form der Umwandlung von einem Wert in einer DataRow, an eine null-variable.
Im Idealfall würde ich in der Lage sein, etwas zu tun:
int? a = dr["A"] as int?;
Bearbeiten: Stellt sich heraus, KÖNNEN Sie dies tun, wird der Nebeneffekt, dass, wenn Sie Ihre Schema-Typen sorglosen ints, dann ist dies IMMER null zurück. Die Antwort von Ruben mit dr.Field<int?>("A")
sorgt type mismatch nicht im hintergrund fehl. Dies ist natürlich abgeholt werden, durch eine umfassende unit-tests.
Stattdessen bin ich in der Regel die Eingabe etwas entlang der Linien von:
int? a = dr["A"] != DBNull.Value ? (int)dr["A"] : 0;
Dies ist ein paar Tastenanschläge, aber noch wichtiger ist, es gibt mehr Raum für jemanden, der Sachen etwas mit einem falschen Tastendruck.
Ja, ein Unit-Test wird das abholen, aber ich würde lieber aufhören, es insgesamt.
Was ist die sauberste und am wenigsten fehleranfällig Muster für diese situation.
InformationsquelleAutor der Frage | 2009-11-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die LINQ to DataSets Kapitel von LINQ in Action ist gut zu Lesen.
Eine Sache, die Sie sehen werden, ist die
Field<T>
Erweiterung Methode wird wie folgt verwendet:-Oder
Oder
InformationsquelleAutor der Antwort Ruben Bartelink
Dies ist der Zweck der
DataRowExtensions
Klasse .NET 3.5, bietet statischeField<T>
undSetField<T>
Methoden für die "round-tripping" nullable (und ungleich null) Daten zwischen denDataRow
und .NET-Typen.wird festgelegt
fld
zunull
wennrow["ColumnA"]
enthältDBNull.Value
um seinen Wert, wenn es enthält ein integer, und eine Ausnahme werfen, wenn er etwas anderes enthält. Und auf dem Weg zurück,tut das gleiche in umgekehrter Richtung: wenn
fld
enthältnull
setztrow["ColumnA"]
zuDBNull.Value
wird, und andernfalls setzt es auf den Wert derfld
.Es gibt überladungen der
Field
undSetField
für alle die Wert-Typen, dieDataRow
unterstützt (einschließlich non-nullable-Typen), so können Sie verwenden Sie den gleichen Mechanismus für den Zugriff und die Einstellung der Felder unabhängig Ihre Daten geben.InformationsquelleAutor der Antwort Robert Rossney
InformationsquelleAutor der Antwort bniwredyc
Warum nicht mit LINQ? Es führt die Konvertierung für Sie.
InformationsquelleAutor der Antwort stepanian
Folgenden arbeiten würde, sicher:
Snip:
Verwendung:
InformationsquelleAutor der Antwort KMån
Erweiterung Methoden!
Etwas wie die folgenden:
Verwenden Sie es wie so:
oder
InformationsquelleAutor der Antwort Brannon
Aufruf der Funktion, die Sie schreiben konnte
InformationsquelleAutor der Antwort Chetan Mandhania
InformationsquelleAutor der Antwort Nilesh S