2012-01-13 9 views
9

Perché il seguente codice:Come posso verificare correttamente DBNull in VB?

A = not IsDBNull(CurRow("BuyBook")) AndAlso CType(CurRow("BuyBook"), string) = "Yes" 

risultati nella seguente errore:

Conversion from type 'DBNull' to type 'String' is not valid. 

Quando AndAlso si suppone cortocircuito secondo questo articolo:

http://support.microsoft.com/kb/817250

+0

Potete provare questo 'A = (non IsDBNull (CurRow (" BuyBook "))) AndAlso CType (CurRow (" BuyBook "), string) =" Sì "' –

+0

eseguire il debug del codice per visualizzare i dati all'interno delle celle . – Boomer

+0

L'ho persino diviso in due dichiarazioni e provato. Penso che IsDBNull sia rotto. – merlin2011

risposta

9

Lei ha ragione. AndAlso è in cortocircuito.

Tuttavia, l'errore viene da chiamandoCurRow("GuyBook") (verificare questo in un debugger per assicurarsi che io non sono un bugiardo o fare alcune ipotesi folli o semplicemente * misremembering ;-). Prima di chiedere un valore, è necessario chiedere al DataRow if it has a value. Cioè, utilizzare:

CurRow.IsNull("BuyBook") 

Felice codifica.


* Un dovrebbe solo essere in grado di confrontare con DBNull.Value o utilizzare IsDBNull. Tuttavia, sono abbastanza certo che ho eseguito una riga prima che queste eccezioni invece di restituire un oggetto DBNull. Inizia scoprendo - nella finestra immediata del debugger - esattamente quale espressione lancia l'eccezione.

0

Invece di non IsDBNull (CurRow ("BuyBook")), utilizzare NOT (CurRow ("BuyBook")) è System.Dbnull.Value). Prova questo:

A = (NOT (CurRow("BuyBook")) is System.Dbnull.Value) AndAlso CType(CurRow("BuyBook"), string) = "Yes" 

O

A = not string.IsNullOrEmpty(CurRow("BuyBook")) AndAlso CType(CurRow("BuyBook"), string) = "Yes" 
+0

Immagino che ti sia sfuggito questo messaggio "Ho persino scomposto in due dichiarazioni e provato". –

4

avete provato a confronto in questo modo:

If CurRow("BuyBook") Is DBNull.Value Then 
    '... 
End If 
+0

Sì, viene visualizzata un'eccezione che dice che non è possibile confrontare un oggetto e un tipo DBNull. – merlin2011

+0

Aggiornato per modificare il confronto eseguito per corrispondere a come è stato eseguito in alcuni dei nostri codici. – Pondidum

-1

In vb.net faccio di solito qualcosa di simile:

A = (CurRow("BuyBook") & "" = "Yes") 

vecchio trucco da un'epoca VB6. Se CurRow("BuyBook") è nullo, vb.net lo considererà come stringa vuota quando lo concatena con un'altra stringa.

+0

Questo non si basa su Option Strict disattivato? Preferirei semplicemente usare il metodo ToString direttamente 'CurRow (" BuyBook "). ToString =" Yes "' se si utilizza questa soluzione. – jmoreno

0
If dt.Rows(0)("BuyBook") = DBNull.Value Then 
End If 

Spero che sia d'aiuto.