Подтвердить что ты не робот

Недопустимое исключение литья при чтении результата из SQLDataReader

Моя хранимая процедура:

    @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

В моем коде С#

SqlDataReader reader = command.ExecuteReader();

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

Может кто-нибудь сказать мне, что я сделал не так? Спасибо.

4b9b3361

Ответ 1

Я предполагаю, что значение возвращается в виде double в коробке вместо float. Когда вы удаляете, тип должен быть точно прав. Поэтому, полагая, что я прав, и это не decimal или что-то в этом роде, вы можете использовать:

float monday = (float) (double) reader["Monday"];

и это сработает. Это довольно уродливо. Если вы используете SqlDataReader.GetFloat, он должен получить это право, если он действительно имеет значение с одной точностью, и это более ясное (IMO), что происходит.

С другой стороны, ваши данные могут действительно возвращаться из базы данных как double, и в этом случае вы должны (IMO) использовать:

float monday = (float) reader.GetDouble(column);

Как в стороне, уверены ли вы, что float на самом деле самый подходящий тип здесь в первую очередь? Часто decimal более подходит...

Ответ 2

sql float - это .NET Double, см. msdn. Попробуйте бросить на двойной.

Ответ 3

У меня также была аналогичная проблема, и я сделал это:

if (!oDR.IsDBNull(0))
    Rating = (float)oDR.GetSqlDecimal(0).Value;

oDR.GetFloat(0) возвращал и недействил исключение cast при доступе к результату SELECT AVG (...).

НТН