Invalid cast exception when reading result from SQLDataReader
My stored procedure:
@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.Star开发者_运维知识库tDate = @StartDate_int and MPU.UserName = @UserName
GROUP BY MPU.UserName
END
In my C# code
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
float monday = (float)reader["Monday"]; // Invalid cast exception
}
Can somebody tell me what I did wrong ? Thank you.
My guess is that the value is being returned as a boxed double
instead of float
. When you unbox the type has to be exactly right. So assuming I'm right and it's not decimal
or something like that, you could use:
float monday = (float) (double) reader["Monday"];
and it would work. That's pretty ugly though. If you use SqlDataReader.GetFloat
it should get it right if it's genuinely a single-precision value, and it's clearer (IMO) what's going on.
On the other hand, your data could actually be coming back from the database as a double
, in which case you should (IMO) use:
float monday = (float) reader.GetDouble(column);
As an aside, are you sure that float
is actually the most appropriate type here in the first place? Often decimal
is more appropriate...
A sql float is a .NET Double, see on the msdn. Try casting to a double.
I also had a similar issue and ended up doing this:
if (!oDR.IsDBNull(0))
Rating = (float)oDR.GetSqlDecimal(0).Value;
oDR.GetFloat(0) was returning and invalid cast exception when accessing the result of a SELECT AVG(...).
HTH
float monday = Convert.ToDouble(reader["Monday"]);
would be a nice approach. I am trying to find a solution for over an hour and it fails here. now it works fine.
精彩评论