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

时间:2011-08-22 10:25:54

标签: c# sql sql-server tsql stored-procedures

我的存储过程:

    @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
        }

有人可以告诉我我做错了什么吗?谢谢。

4 个答案:

答案 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"]);

将是一个很好的方法。我试图找到一个多小时的解决方案,但在这里失败了。现在工作正常。