Недопустимое исключение литья при чтении результата из 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
}
Может кто-нибудь сказать мне, что я сделал не так? Спасибо.
Ответы
Ответ 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 (...).
НТН