回答

收藏

从SQLDataReader读取结果时,无效的强制转换异常

技术问答 技术问答 254 人阅读 | 0 人回复 | 2023-09-14

我的存储过程:
6 X5 i8 R8 b* F, C0 J' H+ J% j2 ?; G                @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#代码中: m! a; _7 g( {
SqlDataReader reader = command.ExecuteReader();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;while (reader.Read())                                          float monday = (float)reader["Monday"]; // Invalid cast exception      有人能告诉我我做错了什么吗?谢谢你。0 D/ k* ^; b* h0 I
                                                                ; E5 |5 I/ t( T  Y
    解决方案:                                                                5 ^# f  B5 B7 c4 R; c
                                                                我的猜测是,该值将被使用double而不是装箱返回float。取消装箱时,类型必须 完全* y) p; j/ t- Z- W; R" A
正确,假设我是对的,但事实并非如此。decimal这样可以用:% ~! V3 u' q, p7 [* F$ T
float monday = (float) (double) reader["Monday"];会工作的。但是,这很丑。如果真的使用单精度值,则9 k- I* e1 z1 H; k& F4 \/ Y
使用SqlDataReader.GetFloat而且,它应该是正确的(IMO)情况更清楚。
0 S. P; _1 a$ _8 k# j/ e__
. k; [6 c3 I, w' U+ B0 k) L另一方面,你的数据 实际上    以可能的形式从数据库返回double,在这种情况下,你应该(IMO)使用:
: b/ Q3 W0 c$ f  N3 Hfloat monday = (float) reader.GetDouble(column);顺便说一句,你确定float首先,它实际上是最合适的类型吗?decimal更合适…
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则