Wie gehen Sie mit Nullable-Typ mit SqlDataRecord
Ich bin Parsen von XML (LINQ to XML), und ich bin mit einem nullable-Typ (int?
und decimal?
) in Fällen, in denen das element /- Attribut leer ist. Jedoch, wenn mit dem Aufbau meiner Sammlung zur übergabe an die DB (Mit TVP) ich weiß nicht, wie man mit den Fällen, in denen der Wert tatsächlich null. Ich kann mich nicht übergeben Sie eine null in der SqlDataRecord SetInt32 oder SetDecimal und ich will nicht auf null gesetzt....Eigentlich will ich es null sein.
Sagt mir keine überladung für die int
?
Zählung unten ist ein nullable-Typ (int?
Count)
SqlDataRecord rec = new SqlDataRecord(
new SqlMetaData("Name", SqlDbType.VarChar, 50),
new SqlMetaData("Type", SqlDbType.VarChar, 50),
new SqlMetaData("Count", SqlDbType.Int));
rec.SetString(0, dm.Name);
rec.SetString(1, dm.Type);
rec.SetString(2, dm.Count);
Irgendwelche Ideen, wie das zu handhaben, ohne Sie zu null (Beibehaltung der null)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Extension Methode:
oder, um mit
SetSqlInt32
wie vorgeschlagen von D Stanley:Hinweis, 9. Dezember 2013: Rückkehr zu dieser Antwort denn der eine Kommentar, bemerkte ich eine kleine Chance zur Verbesserung, basierend auf Eric Lippert ' s-Serie auf nullable-Mikro-Optimierungen, die gefunden werden können, bei http://ericlippert.com/2012/12/20/nullable-micro-optimizations-part-one/.
Kurz, während die
Value
Eigenschaft erfordert weniger Tipparbeit und ist daher wohl mehr als optimal für den Programmierer, es ist eine exception werfen, wenn HasValue false ist. Auf der anderen Seite, dieGetValueOrDefault()
- Methode ist eine einfache Feld-Zugang. DeshalbGetValueOrDefault()
erfordert weniger Anweisungen und mehr wahrscheinlich zu werden, eingebettet, so ist es mehr als optimal für den compiler und den Prozessor.Habe ich noch nie gearbeitet mit
SqlDataRecord
, aber wennDataTable
undDataRow
oder bei Verwendung von parametrisierten Abfragen, die ich angebennull
mitDBNull.Wert
.Mit
SqlDataRecord
, es sieht aus wie Sie verwenden können, dieSetDBNull
Methode.Verwenden sollten
SetSqlInt32
stattSetString
. Versuchenrec.SetSqlInt32(2, (dm.Count.HasValue ? new SqlInt32(dm.Count.Value) : SqlInt32.Null) );
rec.SetSqlInt32(2, dm.Count.HasValue ? dm.Count.Value : SqlInt32.Null);
//Ich habe festgestellt, dass dies das beste für mich, wenn die Prüfung oder der Umgang mit nullable-Typen
//in meinem Beispiel, das ich bin überprüfung der gespeicherten Werte in einem String [] - array
vielleicht können Sie versuchen, die unten.
Als @phoog empfohlen, extension-Methoden für die verschiedenen Arten: