2012-07-04 4 views
8

Мне интересно, является ли это ошибкой или если я что-то не так.Исключение переполнения при чтении десятичных значений из SQL Server

Я загружаю значения с помощью SqlDataReader из базы данных SQL Server 2008, но при определенных обстоятельствах он не может преобразовать значения SQL в значения .net. (.NET 4.0)

Я проследил его вплоть до испытательного случая, который демонстрирует реальную проблему:

Рабочий пример:

"select convert(decimal(38, 19), 260000) as test" 
rs.GetValue(1); 
--> returns 260000 (decimal) 

Не работает exmaple:

"select convert(decimal(36, 26), 260000) as test" 

rs.GetValue(1); 
--> throws 
    System.OverflowException: Conversion overflows. 
    at System.Data.SqlClient.SqlBuffer.get_Decimal() 
    at System.Data.SqlClient.SqlBuffer.get_Value() 
    at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i) 
    at System.Data.SqlClient.SqlDataReader.GetValues(Object[] values) 

Я изучил фактические значения, которые SQL Server сохранил. Они отличаются тем, что нерабочий использует 4 целых числа, чтобы выразить значение, только рабочий.

Я также проверил исходный код с помощью .net Reflector, который представил, что генерируется исключение, если значение существует более затем 3 значения, но я не понимаю, что за ними стоит механика.

Итак, мне интересно, является ли это подлинной ошибкой в ​​.net framework.

+0

Прецизионность для десятичных значений только до 28. Пожалуйста, перейдите по ссылке http://stackoverflow.com/questions/745270/c-sharp-sizeof-decimal – praveen

+0

Но рабочий пример даже использует более высокую точность. – Chuck

ответ

6

Это не то, что вы делаете неправильно, помимо того, что вы, возможно, слишком точны. Я не думаю, что это new problem either.

Вы можете утверждать, что это ошибка, или просто пробел в функциональности. Структура .Net Decimal просто не может представлять значение, которое хранится в вашем SQL Server decimal, так что вызывается OverflowException.

Либо вам нужно манипулировать значением, чтобы что-то совместимое в базе данных, прежде чем вы его извлекли, или прочитайте данные в необработанном двоичном или строчном формате и манипулируйте на стороне .Net.

В качестве альтернативы вы можете написать новый тип, который обрабатывает его.

Возможно, проще всего использовать совместимое определение decimal, если только вам не нужна эта точность. Если вы это сделаете, мне было бы интересно узнать почему.

+0

Параметры точности были выбраны самим SQL-сервером. Сначала я делал некоторые базовые вычисления на сервере между (10,2) и (10,4) полями. Сервер выбрал (36,26) в качестве возвращаемого типа. Теперь я изменил все поля на (18,4), и теперь он работает. – Chuck

Смежные вопросы