从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更合适… |
|
|
|
|
|