我的存储过程:
@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
}
有人可以告诉我我做错了什么吗?谢谢。
答案 0 :(得分:30)
我的猜测是该值以框double
而不是float
的形式返回。当您取消装箱时,类型必须完全正确。因此,假设我是对的并且它不是decimal
或类似的东西,您可以使用:
float monday = (float) (double) reader["Monday"];
它会起作用。那很难看。如果你使用SqlDataReader.GetFloat
它应该正确如果它真的是一个单精度值,并且它更清楚(IMO)发生了什么。
另一方面,您的数据可能实际以double
的形式从数据库返回,在这种情况下您应该(IMO)使用:
float monday = (float) reader.GetDouble(column);
顺便说一句,你确定float
实际上是最合适的类型吗?通常decimal
更合适......
答案 1 :(得分:12)
sql float是.NET Double,请参阅msdn。 尝试施放到双倍。
答案 2 :(得分:1)
我也有类似的问题,最后这样做了:
if (!oDR.IsDBNull(0))
Rating = (float)oDR.GetSqlDecimal(0).Value;
oDR.GetFloat(0)在访问 SELECT AVG(...)的结果时返回了无效的强制转换异常。
HTH
答案 3 :(得分:0)
float monday = Convert.ToDouble(reader["Monday"]);
将是一个很好的方法。我试图找到一个多小时的解决方案,但在这里失败了。现在工作正常。