私のストアドプロシージャ:
@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
}
誰かが私が間違ったことを教えてもらえますか?ありがとうございました。
私の推測では、値はdouble
ではなくボックス化されたfloat
として返されます。ボックスを開くとき、タイプは正確に正しくなければなりません。したがって、私が正しく、decimal
などではないと仮定すると、次のように使用できます。
float monday = (float) (double) reader["Monday"];
そしてそれはうまくいくでしょう。しかし、それはかなり醜いです。使用する場合 SqlDataReader.GetFloat
それは正しくなるはずですifそれは本当に単精度の値であり、何が起こっているのかがより明確(IMO)です。
一方、データは実際にはデータベースからdouble
として返される可能性があります。その場合は、(IMO)使用する:
float monday = (float) reader.GetDouble(column);
余談ですが、そもそもfloat
が実際にここで最も適切なタイプであると確信していますか?多くの場合、decimal
の方が適切です...
SQLFloatは.NETDoubleです。 msdn を参照してください。ダブルにキャストしてみてください。
私も同様の問題を抱えていて、これを行うことになりました:
if (!oDR.IsDBNull(0))
Rating = (float)oDR.GetSqlDecimal(0).Value;
SELECT AVG(...)の結果にアクセスすると、oDR.GetFloat(0)が返され、無効なキャスト例外が発生しました。
HTH