Неверное исключение приведения при чтении результата из SQLDataReader - PullRequest
14 голосов
/ 22 августа 2011

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

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

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

Ответы [ 3 ]

30 голосов
/ 22 августа 2011

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

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

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

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

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

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

12 голосов
/ 22 августа 2011

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

1 голос
/ 13 ноября 2013

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

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

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

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...