2010-11-23 16 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) 
. 
. 
. 
. 

エラー:System.FormatException:文字列が有効なブール値として認識されませんでした。以下のコードの2行目でエラーが発生しました。何が問題なのでしょうか?

はデフォルトとIsBillです、私はいくつかの値は、あなたのテーブルにヌルいると思うだけ

答えて

2

ブール値です。

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


     } 

    } 

Convert.IsDBNull関数を使用して、値がNULLかどうかを確認する必要があります。

+0

私はuが言ったように言った。「System.InvalidCastException:Objectはできません」と言いました。 DBNullから他の型にキャストします。 – Serenity

+0

@Serenity:更新された答えを確認してください:) –

+0

私は言ったように変更しました..それでも私にエラー "Stringは有効なブール値として認識されませんでした。私のテーブルには、IsDEfaultの値がnullであるレコードが4つしかありませんでした。これらの行が削除され、エラーが消えました。IsDefaultが= nullであるかどうかを確認するためにその条件を追加した後でも、 – Serenity

1

明らかに、Visual Studioで使用できるデバッグツールのいくつかにはあまり慣れていません。将来的には

これを自分自身で把握したい場合、私はデバッグ方法をいくつか提案することができますが:

1)は、その行の中でブレークポイントを置いて、次に見に.ToString()メソッドマウスオーバー何を返しているのですか? 2)ブレークポイントにいるときに、「即時ウィンドウ」と表示されているタブをクリックし、何か奇妙な結果を返す可能性のあるコールを入力します。 ds.Tables[0].Rows[I]["IsDefault"].ToString() あなたの呼び出しによって返されているので、あなた自身のバグを解決する可能性が最も高いでしょう!

編集:原因について間違っていましたが、良いデバッグ方法についての提案は価値があります。がんばろう!

+0

簡単な質問、なぜマイナス? –

+0

合意。誰かが投票を下したら、なぜ彼らがそれをやっているのかを少なくとも明記するべきです。 –

0

コード内で何か改善することができます。

(1)通常は、小文字の変数iをループ内で使用します。

(2)コード内で列名を直接使用しないでください。ある日、カラム名が "isDefault"から "DefaultOrNot"(単なる例)に変更されたとすると、あなたのコードのどこでも文字列を変更する必要があるので、それは悪夢です。列挙型はここで役立ちます。

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

table.Rows[0][(int)TableColumns.IsDefault]でテーブルセルにアクセスしてください。列が追加または変更された場合にのみenumを変更する必要があります。

(3)フォーマットの例外は、セルの値がTrue/FalseではなくT/Fであるためです。したがって、boolタイプに変換すると、フォーマットの例外が発生します。

(4)使用する前にこのセルに値があるかどうかを確認することをお勧めします。

EDIT:DBに値を1/0(真の場合は1、偽の場合は0)で保存していますか?可能であれば、使用する必要があります:

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

可能な場合は、IsDefaultおよびIsBill列の値を確認してください。あなたはそれらのためのビット列を持っていますか?はいの場合、1または0が返されている可能性があります。また、簡単にはできないブール値に変換しようとしている可能性があります。

また、nullをチェックしてください。 FormatExceptionは、変換しようとしている値をターゲットタイプで変換できない場合に発生します。

更新日: ここではかっこが間違っていると思います。あなたの最初のToString()の直後に終了した場合

場合& &真(Convert.ToBoolean(ds.Tables [0] .Rows [I] [ "のIsDefault"]。ToStringメソッド())==

+0

よくそれらはビットタイプのです – Serenity

+0

Plz上記の最初の答えの下で私のコメントをチェックしてください.thnx – Serenity

+0

@Serenity:あなたは新しい情報があればあなたの質問を更新する必要があります。誰もがすべての答えを通過するわけではありません。 –

関連する問題