Мне нужно получить данные из БД и выполнить следующий код:
using (var dataRetrievingCommand = new SqlCommand(selectQuery, connection))
{
var dataTable = new DataTable("DataTable");
var sda = new SqlDataAdapter(dataRetrievingCommand);
sda.Fill(dataTable); //OverflowException here
return dataTable;
}
Проблема в том, что некоторые столбцы в базе данных имеют тип decimal(38,10)
, decimal(38, 0)
и т. д. Диапазон их значений больше, чем тип decimal
в C#, поэтому я получаю OverflowException
.
Есть ли способ выбрать эти данные в C# без изменения SQL-запроса и структуры БД?
Если точность значения БД выше, чем у C#, можно округлить значение. если происходит переполнение, я бы хотел вместо этого увидеть NULL или любую другую отметку, что значение не может быть прочитано.
ДЕТАЛИ РАССЛЕДОВАНИЯ:
Вопрос звучит как популярный, но я нашел только один Тема на форуме Microsoft с такой же проблемой и без ответов.
Сама студия SQL Server Management 2008 не может отображать такие значения в режиме редактирования данных - она показывает "" и не позволяет редактировать эти ячейки. Но команды SELECT, INSERT и UPDATE работают нормально и отображают все данные.
Десятичные столбцы с точностью 28 или меньше работают нормально, но любой столбец с более высокой точностью дает сбой, даже если значения не вызывают переполнения, как decimal(38, 38), которые можно просто обрезать, как nvarchar обрезается при вставке.
sda.ContinueUpdateOnError = true;
ничего не меняет. Я думаю, что это просто не операция обновления, поэтому это свойство игнорируется.
sda.FillError += (sender, args) =>
{
args.Continue = true;
};
останавливает генерацию исключений, но данные вообще не возвращаются - только одна бессмысленная строка
CaseName | Decimal_10_2 | Decimal_18_0 | Decimal_18_18 | Decimal_28_0 | Decimal_28_28 | Decimal_38_0 | Decimal_38_20 | Decimal_38_38 | Float | Int
----------+--------------+--------------+---------------+--------------+---------------+--------------+---------------+---------------+-------+----
Null | | | | | | | | | |