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

Xit*_*rum 15 c# sql t-sql sql-server 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
Run Code Online (Sandbox Code Playgroud)

在我的C#代码中

SqlDataReader reader = command.ExecuteReader();

        while (reader.Read())
        {
            float monday = (float)reader["Monday"]; // Invalid cast exception
        }
Run Code Online (Sandbox Code Playgroud)

谁能告诉我我做错了什么?谢谢.

Jon*_*eet 31

我的猜测是,该值将作为盒装double而非返回float.当您取消装箱时,类型必须完全正确.因此,假设我是对的,它不是decimal或类似的东西,你可以使用:

float monday = (float) (double) reader["Monday"];
Run Code Online (Sandbox Code Playgroud)

它会起作用.那很难看.如果你使用SqlDataReader.GetFloat它应该是正确的,如果它真的是一个单精度值,并且它更清楚(IMO)正在发生什么.

另一方面,您的数据实际上可以从数据库返回double,在这种情况下您应该(IMO)使用:

float monday = (float) reader.GetDouble(column);
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你确定这float首先是最合适的类型吗?通常decimal更合适......

  • 如果SQL Server中的数据类型为"float",则不幸的是,调用SqlDataReader.GetFloat会抛出错误,因为命名约定完全不兼容.SQL"float"实际上是一个双精度值,因此映射到.NET double.SQL"real"是映射到.NET float的单精度..NET的名称在内部不一致,而不是选择"double"和"single"作为关键字,它混合了"float",而在SQL中它是"float"和"real"而没有引用双精度或单精度. (17认同)

Pao*_*lla 12

sql float是一个.NET Double,请参见 msdn.尝试施放到双倍.