Von auf null festlegbaren Typen in stark typisierte datatables/datasets - workarounds?
Stark typisierte DataTables support "nullable" Feld-Typen, außer, dass der designer Ihnen nicht erlauben, ändern Sie die Einstellung auf "null zulassen" für einen beliebigen Wert-Typ-Felder. (dh: String-Typen erlauben null-Werte zulässt, aber int ist nicht).
Die Problemumgehung ist, zu nennen IsMyFieldNull() jedes mal, wenn Sie wollen zu bekommen, Myfield. Wenn Sie den Zugriff auf MyField, wenn es enthält eine null, es wird eine eception.
Dies ist eine massive Kopfschmerzen, neben der Entstehung von vielen Laufzeit-Fehler, wenn eine null angezeigt kann Ihre app zum Absturz. Ich habe, beschwerte sich microsoft seit Jahren über diese, noch jede neue Version von visual studio noch nicht erlaubt, nullable value types verwendet werden.
Meine Frage: Wer kennt eine schicke Erweiterung Methode(N), die verwendet werden könnten, um zu arbeiten, um dieses große Manko?
InformationsquelleAutor der Frage Brady Moritz | 2010-07-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie mit .Net 3.5 oder höher, können diese Erweiterungen könnte der nutzen für Sie:
http://msdn.microsoft.com/en-us/library/system.data.datarowextensions.field.aspx
Gemäß der Dokumentation, es unterstützt nullable-Typen. Es ermöglicht die Nutzung von Konstrukten wie
und wenn Sie zuweisen oder eine bereits vorhandene variable des entsprechenden Typs, der compiler kann den Typ abzuleiten automatisch und verlassen Sie den Typ-Bezeichner, so dass es als kurz wie
Immer noch nicht perfekt, aber viel besser lesbar als mit IsMyFieldNull() usw überall.
Oh, und wenn Sie möchten, um mehr auf der sicheren Seite in Bezug auf Rechtschreibfehler Spaltennamen, die Sie verwenden können, Dinge wie
Vergessen Sie nicht, fügen Sie einen Verweis auf System.Daten.DataSetExtensions.
InformationsquelleAutor der Antwort M-Peror
In VS 2008 können Sie nur geben Sie eine " 0 " in der nullvalue-Eigenschaft.
Wenn Sie mit vs2005 Sie tun müssen, es mit einem XML-editor.
Sie müssen
msprop:nullValue="0"
als Attribut der Spalte.InformationsquelleAutor der Antwort Julian de Wit
Ich bin damit einverstanden, dass es wäre ein nettes feature zu ermöglichen nullable-Typen.
Wenn Sie die "NullValue" - Eigenschaft der Spalte auf "-1" anstelle von "(Throw exception)" die Eigenschaft zurück "-1", wenn die Spalte null ist, statt eine Ausnahme zu werfen. Sie haben noch um die Spalte null-Werte zulässt.
Alternativ können Sie immer legen Sie den Datentyp "System.Objekt", und null-Werte zulassen=true. Sie können den Zugriff auf den Wert der Spalte, ohne dass das "IsMyFieldNull ()" - Methode. Der Wert der Spalte "System.DbNull.Wert", wenn die Spalte null ist. Wenn Sie nicht wie die Verwendung von "System.DbNull.Wert" können Sie die "NullValue" - Eigenschaft auf "" (Nichts)" statt "(Throw exception)" und vergleichen Sie dann das Objekt in ein null-Verweis.
InformationsquelleAutor der Antwort Carter Medlin
Könnte man dies tun:
set AllowDbNull auf true, wenn Sie nicht gesetzt ist; DefaultValue bleibt ; NullValue bleibt auf (Throw exception). Dann von code, wenn Sie möchten, um die Einstellung auf null eine Spalte, die Sie verwenden können errichtet in der Methode Set_Column_Null().
Sehen Sie mein Beispiel:
InformationsquelleAutor der Antwort Alexa Adrian
Ich musste einfach, eine Arbeit zu finden-rund um. Ich brauchte, um zu ändern, einige alte code für eine web-Seite, geschrieben für ASP.NET 2.0. Die Seite verwendet Telerik RadMenu, ein Menü-Steuerelement. Diese Komponente benötigt die root-Elemente, um eine ordnungsgemäße DBNull-Werte (für parentIDs).
Also, wenn ich kompiliert habe den alten code, der RadMenu Komponente gab mir viele Probleme. Erste Ausnahmen in Bezug auf Einschränkungen, dann ist es nicht zu verstehen, welche Elemente wurden root-Elemente und die ganze Sache sah schrecklich aus.
Aber ich löste es, und das ist was für mich gearbeitet.
In der Eigenschaften-Seite des ParentID " - Spalte in der Tabelle Adapter-designer, die ich verwendet habe:
- AllowDBNull: true
- Standardwert: -1 (-1 ist ein Wert, der nicht normalerweise auftreten, für die Spalte)
Der NullValue-Eigenschaft blieb bei "Throw Exception" da war es unmöglich, zu ändern für mich.
Und in den code mit den Werten aus der Tabelle adapter, habe ich dieses Konstrukt (VB.NET code, der nicht C#, da diese Frage markiert):
Den generierten code für die Tabelle-Adapter erzeugt zwei Funktionen für jede Spalte, sollte es DBNULLs. Sie sollen verwendet werden, beim Umgang mit Null-Werten, aber es ist eine ungeschickte Lösung von Microsoft. Was passiert hinter den kulissen ist, dass die der Tabelle adapter-Ausgang der Spalte DefaultValue statt von NULL von der Get-Funktion. Das nenne ich ein "simulierter " NULL" oder ein "fake " NULL".
Die Funktion IsParentIDNull() auch tatsächlich überprüfen, wenn die Zeile enthält, die diese "fake " NULL", z.B. die Spalte DefaultValue, und wenn es funktioniert, ich bin das einfügen eines ordnungsgemäßen DBNull mit der SetParentIDNull () - Funktion.
Diese Lösung funktioniert bei mir, aber ist nicht sehr elegant, noch ist es sehr effizient, aber es könnte helfen, jemand anderes, hoffe ich.
InformationsquelleAutor der Antwort NilsAndreas
Ich bin mir nicht sicher, warum
var x = !IsMyFieldNull() ? MyField : null
(oder ähnliches) ist eine solche Kopfschmerzen.Ich nehme an, Sie könnten schreiben eine wrapper-SqlDataReader-Falle für diejenigen, die null-Werte irgendwie liest du die Daten in die DataTable, oder Sie könnten schreiben das äquivalent von
.TryParse()
für Ihre Anfragen: etwas schönes und gekapselt wie:wo .TryParse ist eine Erweiterung Methode suchen so etwas wie:
Dies ist, wie Sie sehen können, im Grunde pseudo-code rau, aber Sie bekommen die Idee. Schreiben Sie Ihren code einmal, dann rufen Sie es als eine Erweiterung Methode.
InformationsquelleAutor der Antwort AllenG
Nullable-Typen eingeführt wurden .net 3.0, diese können verwendet werden, mit Daten-sets. Deklarieren Sie eine int nullable wie diese
int? myNullableInt = null
Hier ist ein link zu dem MSDN-Artikel: Nullable-Typen C#
Persönlich würde ich meiden, null-Werte in Datenbanken, die in der ersten Stelle (wenn Sie die luxry, dies zu tun). NULL ist wirklich da, um ein "Undefined" oder "Unbekannt" - status. Es ist selten dieses problem haben, zum Beispiel ein String-Feld enthält ein Familienname wird oft eingestellt werden, um null-Werte zulässt, in der Erwägung, dass standardmäßig auf "ein" wäre eine viel bessere option. Putting null-Werte in Datenbanken macht die Dinge unnötig schwer Null-Werte In Datenbankenzusätzlich propagiert die null-Werte in die code-und Sie müssen arbeiten, um zu vermeiden, die null-Referenz Ausnahmen.
Gibt es leider eine Menge schlechte Sachen geschrieben über das Internet, DBs (wie die über-die Verwendung der null als OK). Diese Ansichten sind in der Regel durch Menschen, die wirklich don ' T verstehen die Theorie hinter Ihnen, ein weiteres klassisches Beispiel ist eine DB ohne Beziehungen ", weil es flexibler/schneller zu handhaben diese in code". Dies bedeutet die dev zu re-schreiben vorhandene [Datenbank-layer] - Funktionalität, dass die Datenbank Zwangsläufigkeit nicht umgehen, effizienter und mit größerer Zuverlässigkeit. Ich sage Zwangsläufigkeit wie, natürlich, die dev tun die re-write neu-Implementierung Zeug, dass Oracle/Microsoft/Wer hatten großen teams verbringen viel Zeit optimieren etc. Aber jeder so oft, Sie sehen das jemand befürworten, diese als design. Dieser Kerl versteht wirklich, Datenbanken, DBDebunkings er verbrachte eine Menge Zeit versucht, zu entlarven eine Menge Unsinn arugments, nehmen relationalen Datenbanken Weg von Ihren theoretischen Wurzeln.
InformationsquelleAutor der Antwort Keith Paul Barrow