简体   繁体   中英

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.StartDate = @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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM