Pergunta
Preciso de alguns conselhos de esperança sobre como lidar com o seguinte:- Eu tenho um campo de dados misc_text_2 que é do tipo varchar (25) e permite nulo. Agora, se eu usar a seguinte sintaxe
<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>
Eu continuo obtendo uma exceção de erro Detalhes: System.inValidCastException: a conversão do tipo 'dbNull' para digite 'string' não é válida.
Eu sei que estou perdendo alguma coisa, mas o que ...
desde já, obrigado
Solução
Você pode em sua consulta SQL Usar isNull (misc_text_2, '') para retornar a string vazia em vez de dbnull.
Outras dicas
Você deve verificar explicitamente para DBNull.Value
e faça a conversão você mesmo.
Em outras palavras, construa um método que fará a conversão para você, tomando DBNull.Value
em conta.
Não respondendo à sua pergunta, mas: você realmente deve criar um código por trás do método que faça a conversão. Isso tornará o código mais fácil de entender e depurar e possibilitará a reutilização do código.
Cada vez que você usa a avaliação, você precisa de uma avaliação preguiçosa, de alguma forma. Para fazer isso, substitua cada instância de:
iif(eval("misc_text_2") like ...
com
iif(IsDbNull(eval("misc_text_2")) OrElse eval("misc_text_2") like ...
o OrElse
impedirá qualquer tentativa de conversão de um dbnull em booleano. No entanto, de uma perspectiva mais fundamental, o Bang é mais corrigido. Tudo isso deve ser feito código-behind, provavelmente no manipulador de eventos ItemDatabound (ou RowDatabound).
Após mais reflexão ...
O OP também pode fazer uso do Convert.ToString()
Método em seu código, que converterá DBNulls em String.Empty.
Como temos um banco de dados herdado configurado para o MS-Dynamics (Solomon), nosso método de manusear nulos é convertê-los em seqüências nulas no código ASP ou VB.NET. ou seja
Trim$(misc_text_2 & " ")
Livre -se do problema para qualquer versão do VB.
Se você estiver usando o designer de conjuntos de dados, a maneira mais fácil de se livrar desse erro é alterar as propriedades da coluna respeitada.
Exceção de NullValue a "vazio" em vez de "Exceção de arremesso".
Espero que isso ajude a todos.
Para converter dbnull ou isdbnull, você pode tentar as seguintes maneiras:
Converter dbnull em uma corda vazia
(Dbnullobj) .ToString
Crie uma função de conversor dbnull
Função pública ConvertdBNullToString (dbnullobj como objeto) como string
Se isdbnull (dbnullobj) então
Retorna ""
fim se
Retornar dbnullobj
Função final
Como o SpiritUMTP sugeriu, se você estiver usando o designer do conjunto de dados, altere o datacolumn.nullValue de "Exceção de arremesso" para "vazio" ou "nada". Eu escolhi o último e resolveu o problema. Agora, apenas verifico nada (se não estiver (columnfax) então ...)