Prüfen auf DBNull wirft einen StrongTypingException
Frage
Ich verwende einen Datensatz Daten aus einer DB zu ziehen. Eines der Felder in einer Zeile ist NULL
. Ich weiß das. Allerdings wirft der folgende vb.net Code ein StrongTypingException
(in der automatisch generierte get_SomeField () -Methode im Daten-Set-Designer):
If Not IsDBNull(aRow.SomeField) Then
'do something
End If
Dokumentation Nach und sollte es in Ordnung sein.
edit: If aRow.SomeField is DBNull.Value Then
gibt auch den gleichen Fehler. Argh.
Lösung
Der Unterschied ist, dass in der entsprechenden Frage sie über einen nicht typisierten Wert spricht (das heißt object
) über einen Indexer. Wenn Sie über .SomeField
gehen, ist die Art bereits enthalten - so diese int
usw. sein könnte und es würde keinen Sinn machen IsDBNull
auf einem int
zu versuchen, als int
können nie sein DBNull
Im Wesentlichen die SomeField
ist ein Wrapper für (entschuldigen Sie den C # Akzent ...)
public int SomeField {
get { return (int) this["someFieldName"]; }
set { this["someFieldName"] = value; }
}
Ich bin keine große DataTable
Person, aber sie versuchen, es nach Namen / index / Spalte Überprüfung könnten; oder Markierung, die Säule als NULL festlegbaren, so dass es Nullable<int>
(im Beispiel oben).
Andere Tipps
Nur ein paar zusätzliche Informationen: Die Ausnahme kommt, weil Sie ein stark typisierte DataSet verwenden. StrongTypingException Dokumentation heißt es:
Die Ausnahme, die von einem stark typisierte DataSet wird ausgelöst, wenn der Benutzer greift auf einen DBNull Wert.
Die Verwendung von stark typisierte Datasets ist etwas anders als die der nicht typisierten diejenigen. Mit stark typisierte Datasets erhalten Sie automatisch einige erweitert / zusätzliche Methoden für die Felder, die Sie anrufen können. In Ihrem Fall würden Sie sehr wahrscheinlich rufen müssen:
If Not aRow.IsSomeFieldNull Then
'do something
End If
Versuchen Sie folgendes: aRow.IsSomeFieldNull
Es ist eine nette Art und Weise um ihn herum gehen. Aber Sie müssen sich bewusst Folgen.
Um zu verhindern, außer auftreten Sie in Datasetfeld Eigenschaft Nullvalue entweder auf „Null“ oder „Empty“ ändern können (alles nach Ihren Bedürfnissen). Standard wird auf „Exception werfen“.
Für einen Referenz Blick hier: Msdn Dokumentation
Viel Glück.
**DateTime? ToDate = (row.IsToDateNull()) ? null : row.IsToDate;**
Diese Frage ist alt, aber was ich hinzufüge, scheint nicht in eine der anderen Antworten zu sein.
Wenn Sie
If Not IsDBNull(aRow.item("SomeField")) Then
'do something
End If
Dies wird eine Ausnahme nicht einmal werfen, wenn Sie einen stark verwenden typisierte Datasets