12

私のウェブサイトが次のコードに到達すると、次のような例外が発生します。

System.InvalidCastException: オブジェクトを DBNull から他の型にキャストできません。

簡潔にするために、関連するコードのみを示しています (これは私が提供した 4000 以上の LOC ファイルです)。

if (dr["STAGE"] is DBNull)
{
    dto.Stage = 1; // This is the line throwing the exception, according to stack trace
}
else
{
    dto.Stage = Convert.ToInt32(dr["STAGE"]);
}

ここでdr、データベースへのクエリの結果である DataRow オブジェクトは、メンバーdtoであるいくつかのプロパティを保持するだけの基本クラスです。dto.Stageint

同じエラーメッセージで他の質問を見てきましたが、それらのほとんどは「DBNullかどうかを確認する」ことを提案しているようです。これはすでに行っています。

それで、誰かが解決策を提案できますか?

4

5 に答える 5

5

==の代わりに使用is

if (dr["STAGE"] == DBNull.Value)
{

}
于 2012-06-26T14:13:23.597 に答える
2

この少し効率的なアプローチを使用してください

int stageOrdinal = dr.GetOrdinal("STAGE");
while (dr.Read()) {
     dto = new DataTransferObject();
     if (dr.IsDBNull(stageOrdinal)) {
         dto.Stage = 1;
     } else {
         dto.Stage = dr.GetInt32(stageOrdinal);
     }
     //TODO: retrieve other columns.
     dtoList.Add(dto);
}

インデックスで列にアクセスする方が、名前でアクセスするよりも高速です。GetOrdinal列のインデックスは、 のメソッドで取得できますDataReader。これは、ループの前に行うのが最適です。

于 2012-06-26T14:19:48.420 に答える
1

代わりにSystem.Data.DataRow.IsNull関数を使用してください。

if(dr.IsNull("Stage"))
{
 ...
}
于 2012-06-26T14:14:09.963 に答える
0

@MarcGravell のコメントにはその権利がありました。

スタック トレースの正確な行番号は無視してください。数字はわずかにずれている可能性があります-私はいつもそれを見ています。代わりにブレークポイントを使用してデバッガーで実行するか、特定している間にログを追加するだけです

@Sergeyの答えはまったく間違っています。

于 2012-08-07T10:05:40.673 に答える
0

以下は、DBNull エラーを回避するために使用できる null 許容データ型の例です。以下の例は、あなたが抱えている問題の真の解決策ではありませんが、それを解決する方法の例です. 魚を与えられるのではなく、釣りを学ぶことだと考えてください。

これをhttp://msdn.microsoft.com/en-us/library/1t3y8s4s.aspxから取得しました

class NullableExample
{
    static void Main()
    {
        int? num = null;
        if (num.HasValue == true)
        {
            System.Console.WriteLine("num = " + num.Value);
        }
        else
        {
            System.Console.WriteLine("num = Null");
        }

        // y is set to zero
        int y = num.GetValueOrDefault();

        // num.Value throws an InvalidOperationException if num.HasValue is false
        try
        {
            y = num.Value;
        }
        catch (System.InvalidOperationException e)
        {
            System.Console.WriteLine(e.Message);
        }
    }
}
于 2012-06-26T14:23:40.620 に答える