2010-11-23 7 views
0
for (I = 0; I < ds.Tables[0].Rows.Count; I++) 
{ 
if (Convert.ToBoolean(ds.Tables[0].Rows[I]["IsDefault"].ToString()) == true && Convert.ToBoolean(ds.Tables[0].Rows[I]["IsBill"].ToString()) == true) 
. 
. 
. 
. 

Erreur: System.FormatException: la chaîne n'a pas été reconnue en tant que valeur booléenne valide.Obtenir l'erreur sur la deuxième ligne dans le code ci-dessous .. Ce qui pourrait être faux?

est sélectionné par défaut et Isbill sont des valeurs booléennes ne

Répondre

2

Je pense que certaines valeurs sont nulles dans votre table.

if (ds.Tables[0].Rows[I]["IsDefault"] != null && ds.Tables[0].Rows[I]["IsBill"]) != null) 
    { 
     if (Convert.ToBoolean(ds.Tables[0].Rows[I]["IsDefault"].ToString()) == true && Convert.ToBoolean(ds.Tables[0].Rows[I]["IsBill"]..ToString()) == true) 
     { 


     } 

    } 

Vous devrez peut-être utiliser la fonction Convert.IsDBNull pour vérifier si la valeur est NULL.

+0

J'ai fait comme vous l'avez dit ... maintenant il est dit "System.InvalidCastException: Object ne peut pas être cast de DBNull à d'autres types. " – Serenity

+0

@Serenity: Vérifiez la réponse mise à jour :) –

+0

J'ai changé comme vous l'avez dit..still m'a donné l'erreur "String n'a pas été reconnu comme un booléen valide." Il n'y avait que 4 enregistrements dans ma table avec la valeur IsDEfault comme nulle..J'ai supprimé ces lignes et l'erreur a disparu..Pourquoi a-t-il donné une erreur même après avoir ajouté cette condition pour vérifier si IsDefault est! = Null? – Serenity

1

De toute évidence, vous n'êtes pas à l'aise avec certains des outils de débogage disponibles dans Visual Studio.

À l'avenir, si vous voulez comprendre ce vous-même, je peux suggérer quelques méthodes de débogage:

1) Mettre un point d'arrêt dans cette ligne et à mousing puis sur la méthode ToString() pour voir ce qu'il retourne 2) Lorsque vous êtes au point d'arrêt, cliquez sur l'onglet qui dit "fenêtre immédiate", puis tapez l'appel qui pourrait renvoyer quelque chose d'étrange, dans ce cas ds.Tables[0].Rows[I]["IsDefault"].ToString() Vous pouvez alors voir le résultat que est renvoyé par votre appel et vous allez probablement résoudre vos propres bugs! Edit: Je me suis trompé sur la cause, mais je pense qu'une suggestion sur une bonne pratique de débogage en vaut la peine! Bonne chance!

+0

Question rapide, pourquoi le moins? –

+0

D'accord. Si quelqu'un donne un vote négatif, ils devraient au moins préciser pourquoi ils le font. –

0

Quelque chose peut être amélioré dans votre code.

(1) Habituellement, nous utilisons une variable minuscule i dans la boucle.

(2) N'utilisez pas les noms de colonne directement dans votre code. Supposons un jour, le nom de la colonne est changé de "isDefault" à "DefaultOrNot" (juste un exemple), c'est un cauchemar parce que vous avez besoin de modifier les chaînes partout dans votre code. Une énumération est utile ici.

enum TableColumns //well, it's a bad name 
{ 
    ID = 0, 
    Name = 1, 
    IsDefault = 2 
} 

et visitez votre cellule de table avec table.Rows[0][(int)TableColumns.IsDefault]. Vous devez modifier le enum uniquement si des colonnes sont ajoutées ou modifiées.

(3) Je pense que l'exception de format est due à ce que la valeur de la cellule est T/F au lieu de True/False. Donc, la conversion au type bool entraînera une exception de format.

(4) Vous feriez mieux de vérifier s'il existe une valeur dans cette cellule avant de l'utiliser.

EDIT: stockez-vous la valeur dans DB avec 1/0 (1 pour true et 0 pour false)? Vous devez donc utiliser:

object cell = table.Rows[0]["IsDefault"]; 
if (cell != null && !Convert.IsDBNull(cell)) 
{ 
    if (cell.ToString().Equals("1")) 
    { 
     //do something 
    } 
} 
0

Vérifiez les valeurs des colonnes IsDefault et IsBill dans votre base de données, si vous le pouvez. Avez-vous une colonne pour eux? Si oui, il se peut que vous retourniez 1 ou 0 et que vous essayiez de les convertir en booléen, ce qui n'est pas si facile.

Vérifiez également null. Le FormatException vient quand la valeur que vous essayez de convertir ne peut être convertie sur le type de cible.

MISE À JOUR: Je pense que vous avez mal les parenthèses ici. Votre cas est immédiatement après la fin de la première ToString()

si (Convert.ToBoolean (ds.Tables [0] .Rows [I] [ "IsDefault"] ToString().) == true & & Convert.ToBoolean (ds.Tables [0] .Rows [I] ["IsBill"]. ToString()) == true)

+0

bien qu'ils sont de type bit seulement – Serenity

+0

Plz vérifier mon commentaire sous la première réponse ci-dessus..thnx – Serenity

+0

@Serenity: Vous devez mettre à jour votre question si vous avez de nouvelles informations. Tout le monde ne passera pas par toutes les réponses. –

Questions connexes