web-dev-qa-db-ja.com

SQLDataReaderから結果を読み取るときに無効なキャスト例外

私のストアドプロシージャ:

    @UserName nvarchar(64),

    AS

    BEGIN
    SELECT MPU.UserName, SUM(TS.Monday)as Monday //TS.Monday contains float value
    FROM dbo.MapTask MT JOIN dbo.MapPU MPU
    ON MPU.ID = MT.MPUID
    JOIN dbo.TimeSheet TS
    ON MT.TMSID = TS.ID
    WHERE MT.StartDate = @StartDate_int and MPU.UserName = @UserName
    GROUP BY MPU.UserName
    END

私のC#コードでは

SqlDataReader reader = command.ExecuteReader();

        while (reader.Read())
        {
            float monday = (float)reader["Monday"]; // Invalid cast exception
        }

誰かが私が間違ったことを教えてもらえますか?ありがとうございました。

15
Xitrum

私の推測では、値はdoubleではなくボックス化されたfloatとして返されます。ボックスを開くとき、タイプは正確に正しくなければなりません。したがって、私が正しく、decimalなどではないと仮定すると、次のように使用できます。

float monday = (float) (double) reader["Monday"];

そしてそれはうまくいくでしょう。しかし、それはかなり醜いです。使用する場合 SqlDataReader.GetFloat それは正しくなるはずですifそれは本当に単精度の値であり、何が起こっているのかがより明確(IMO)です。

一方、データは実際にはデータベースからdoubleとして返される可能性があります。その場合は、(IMO)使用する:

float monday = (float) reader.GetDouble(column);

余談ですが、そもそもfloatが実際にここで最も適切なタイプであると確信していますか?多くの場合、decimalの方が適切です...

30
Jon Skeet

SQLFloatは.NETDoubleです。 msdn を参照してください。ダブルにキャストしてみてください。

12
Paolo Falabella

私も同様の問題を抱えていて、これを行うことになりました:

if (!oDR.IsDBNull(0))
    Rating = (float)oDR.GetSqlDecimal(0).Value;

SELECT AVG(...)の結果にアクセスすると、oDR.GetFloat(0)が返され、無効なキャスト例外が発生しました。

HTH

0
Fred Mauroy