Domanda

Sto usando un set di dati per estrarre i dati da un DB. Uno dei campi in una riga è NULL. Lo so. Tuttavia, il seguente codice vb.net getta un StrongTypingException (nel get_SomeField generata automaticamente (metodo) nella finestra di progettazione set di dati):

If Not IsDBNull(aRow.SomeField) Then
'do something
End If

Secondo la documentazione e questa domanda dovrebbe andare bene.

modifica: If aRow.SomeField is DBNull.Value Then restituisce anche lo stesso errore. Argh.

È stato utile?

Soluzione

La differenza è che nella relativa domanda si sta parlando di un valore non tipizzato (vale a dire object) tramite un indicizzatore. Quando si va via .SomeField, il tipo è già incluso - quindi questo potrebbe essere int ecc E non avrebbe senso provare IsDBNull su un int, come int possono non essere DBNull

In sostanza, la SomeField è un wrapper per (scusate il C # accento ...)

public int SomeField {
    get { return (int) this["someFieldName"]; }
    set { this["someFieldName"] = value; }
}

Io non sono una persona enorme DataTable, ma si potrebbe provare a controllare per nome / indice / colonna; o marcatura la colonna come nullable modo che sia Nullable<int> (nell'esempio precedente).

Altri suggerimenti

Solo alcune informazioni aggiuntive: L'eccezione viene perché si sta utilizzando un DataSet fortemente tipizzato . StrongTypingException documentazione dice che:

L'eccezione che viene generata da un DataSet fortemente tipizzato quando l'utente accede a un valore DBNull.

L'utilizzo di DataSet fortemente tipizzati è leggermente diverso da quello di quelli non tipizzati. Con DataSet fortemente tipizzati si ottiene automaticamente alcune estese metodi / aggiuntivi significativi per i campi che è possibile chiamare. Nel tuo caso si avrebbe molto probabilmente dovuto chiamare:

If Not aRow.IsSomeFieldNull Then
   'do something
End If

Prova questo: aRow.IsSomeFieldNull

C'è un modo pulito di andare intorno ad esso. Ma è necessario essere consapevoli delle conseguenze.

Per evitare eccezione che si verificano è possibile modificare nel set di dati di proprietà campo NullValue a uno "Null" o "vuoto" (qualunque cosa si adatta alle vostre esigenze). Di default è impostato su "Eccezione Throw".

Per un look di riferimento qui: MSDN documentazione

In bocca al lupo.

**DateTime? ToDate = (row.IsToDateNull()) ? null : row.IsToDate;**

This question is old but what i'm adding doesn't seem to be in any of the other answers.

If you use

If Not IsDBNull(aRow.item("SomeField")) Then
    'do something
End If

This will not throw an exception even if you're using a strongly typed dataset

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top