Comment gérer la conversion de type «dbnull» pour type «chaîne» n'est pas valide

StackOverflow https://stackoverflow.com/questions/536212

  •  22-08-2019
  •  | 
  •  

Question

J'ai besoin d'attendre des conseils sur la façon de gérer ce qui suit: - J'ai un champ de données Misc_text_2 qui est de type VARCHAR (25) et permet Null. Maintenant, si j'utilise la syntaxe suivante

<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>

Je continue à obtenir une erreur Détails de l'exception: System.InvalidCastException: La conversion de type «dbnull» pour taper «chaîne» n'est pas valide.

Je sais que je manque quelque chose, mais quoi ...

Merci d'avance

Était-ce utile?

La solution

Vous pourriez dans votre requête SQL à utiliser ISNULL (MISC_TEXT_2, '') pour retourner en chaîne vide au lieu de Dbnull.

Autres conseils

Vous devez vérifier explicitement DBNull.Value Et faites la conversion vous-même.

En d'autres termes, construire une méthode qui fera la conversion pour vous, en prenant DBNull.Value en compte.

Ne pas répondre à votre question, mais: vous devriez vraiment créer un code derrière la méthode qui fait la conversion. Cela rendra le code plus facile à comprendre et à déboguer, et permettra de réutiliser le code.

Chaque fois que vous utilisez l'évaluation, vous devez en quelque sorte une évaluation paresseuse. Pour ce faire, remplacez chaque instance de:

iif(eval("misc_text_2") like ...

avec

iif(IsDbNull(eval("misc_text_2")) OrElse eval("misc_text_2") like ...

La OrElse Empêchera toute tentative de conversion d'un dbnull en booléen. Cependant, dans une perspective plus fondamentale, Bang est le plus correct. Tout cela doit être fait de code de code, probablement dans le gestionnaire d'événements ItemDatabound (ou RowDatabound).

Après une réflexion plus approfondie ...

Le PO pourrait également utiliser le Convert.ToString() Méthode dans son code, qui convertira DBNULLS en string.empty.

Étant donné que nous avons une base de données héritée qui a été configurée pour MS-Dynamics (Solomon), notre méthode de gestion NULLS est de les convertir en chaînes NULL dans le code ASP ou VB.NET. c'est à dire

Trim$(misc_text_2 & " ")

Se débarrasser du problème pour toute version de VB.

Si vous utilisez des concepteurs de jeux de données, le moyen le plus simple de se débarrasser de cette erreur est de modifier les propriétés de la colonne respectée.

Exception de nullvalue à "vide" au lieu de "lancer une exception".

J'espère que cela vous aidera tous.

Pour convertir dbnull ou isdbnull, vous pouvez essayer cette façon:

  1. Convertir dbnull en une chaîne vide

    (Dbnullobj) .tostring

  2. Créer une fonction de convertisseur dbnull

    Fonction publique convertdbnulltoString (dbnullobj comme objet) comme chaîne

    Si isdbnull (dbnullobj) alors

    revenir ""

    fin si

    retour dbnullobj

    Fonction finale

Comme l'a suggéré SpirituMTP, si vous utilisez le concepteur de jeu de données, modifiez le datacolumn.nullvalue de "lancer l'exception" à "vide" ou "rien". J'ai choisi ce dernier et cela a résolu le problème. Je ne vérifie plus rien (si Isnuthing (Columnfax) alors ...)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top