从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