Come gestisco la conversione dal tipo "dbnull" per digitare "stringa" non è valida
Domanda
Ho bisogno di aspettare consigli su come gestire quanto segue:- Ho un campo di dati misc_text_2 che è di tipo varchar (25) e consente null. Ora se utilizzo la seguente sintassi
<asp:Label ID="lblPrinter" runat="server" Text='<%# iif(eval("misc_text_2") is dbnull.value, "", iif(eval("misc_text_2") like "NA", "None", iif(eval("misc_text_2") like "KP1", "Kitchen Printer 1", iif(eval("misc_text_2") like "KP2", "Kitchen Printer 2", iif(eval("misc_text_2") like "KP3", "Kitchen Printer 3", iif(eval("misc_text_2") like "BP1", "Bar Printer 1", iif(eval("misc_text_2") like "BP2", "Bar Printer 2", iif(eval("misc_text_2") like "BP3", "Bar Printer 3", Eval("misc_text_2")))))))))%>'></asp:Label>
Continuo a ottenere un'eccezione di errore Dettagli: System.InvalidcastException: la conversione dal tipo "dbnull" in tipo "stringa" non è valida.
So che mi manca qualcosa, ma cosa ...
Grazie in anticipo
Soluzione
È possibile che nella tua query SQL usi isNull (misc_text_2, '') per restituire una stringa vuota anziché DBnull.
Altri suggerimenti
Devi verificare esplicitamente DBNull.Value
E fai la conversione da solo.
In altre parole, costruisci un metodo che farà la conversione per te, prendendo DBNull.Value
in considerazione.
Non rispondere alla tua domanda, ma: dovresti davvero creare un codice dietro il metodo che esegue la conversione. Ciò renderà il codice più facile da comprendere e eseguire il debug e consentirà di riutilizzare il codice.
Ogni volta che usi la valutazione, devi evitare una valutazione pigra, in qualche modo. Per fare ciò, sostituire ogni istanza di:
iif(eval("misc_text_2") like ...
insieme a
iif(IsDbNull(eval("misc_text_2")) OrElse eval("misc_text_2") like ...
Il OrElse
impedirà qualsiasi tentativo di conversione di un dbnull in booleano. Tuttavia, da una prospettiva più fondamentale, il bang è più corretto. Tutto questo dovrebbe essere fatto in codice, probabilmente nel gestore di eventi ItemDataBound (o RowDataBound).
Su ulteriore riflessione ...
L'OP potrebbe anche utilizzare il Convert.ToString()
Metodo nel suo codice, che convertirà dbnulls in string.empty.
Dal momento che abbiamo un database legacy che è stato impostato per MS-Dynamics (Solomon), il nostro metodo di gestione dei null è convertirli in stringhe nulla nel codice ASP o VB.NET. cioè
Trim$(misc_text_2 & " ")
Sbarazza il problema per qualsiasi versione di VB.
Se si utilizza il progettista del set di dati, il modo più semplice per sbarazzarsi di questo errore è modificare le proprietà della colonna rispettata.
NullValue Eccezione a "vuoto" invece di "lanciare eccezione".
Spero che questo vi aiuti tutti.
Per convertire dbnull o isdbnull puoi provare in questo modo:
Convertire dbnull in una stringa vuota
(Dbnullobj) .toString
Crea una funzione di convertitore DBNULL
Funzione pubblica convertdbnulltostring (dbnullobj come oggetto) come stringa
Se isdbnull (dbnullobj)
Restituzione ""
finisci se
return dbnullobj
Funzione di fine
Come suggerito dallo SpiriMTP, se si utilizza il progettista di set di dati, modifica DataColumn.nullValue da "Throw Exception" a "vuoto" o "niente". Ho scelto quest'ultimo e ha risolto il problema. Ora non controllo solo niente (se non è nitido (columnfax) allora ...)