从SQLDataReader读取结果时出现无效的强制转换exception
我的存储过程:
@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
它应该是正确的, 如果它真的是一个单精度值,并且它更清楚(IMO)正在发生什么。
另一方面,您的数据实际上可以作为double
从数据库返回,在这种情况下您应该(IMO)使用:
float monday = (float) reader.GetDouble(column);
顺便说一句,你确定float
实际上是最合适的类型吗? decimal
通常更合适……
sql float是一个.NET Double,请参见msdn 。 尝试施放到双倍。
我也有类似的问题,最后这样做:
if (!oDR.IsDBNull(0)) Rating = (float)oDR.GetSqlDecimal(0).Value;
当访问SELECT AVG(…)的结果时,oDR.GetFloat(0)返回并且返回了无效的强制转换exception。
HTH