Ошибка Sql Арифметическая операция привела к переполнению.

Я запускаю службу, которая выполняет некоторые вычисления и связывается с сервером MS SQL каждую минуту или около того (24/7, время безотказной работы очень важно) и записывает в журнал ошибок, если происходит что-то смешное (например, тайм-аут или потеря соединения).

Это прекрасно работает, однако время от времени я получаю эту ошибку:

Арифметическая операция привела к переполнению.

Поскольку это выполняется на стороне клиента, и исключение возникало только 3 раза с момента запуска проекта (уже пару месяцев), это было бы чрезвычайно сложно поймать и отладить.

Я использую OleDbDataAdapter для связи с сервером. Данные, полученные с сервера, не были чем-то особенным, по крайней мере, мне известно! Данные никогда не должны превышать размеры полей и т. д., поэтому я не могу придумать причину возникновения этой ошибки. Опять же, это очень сложно проверить, так как все, что я получаю, это сообщение об ошибке.

Мой вопрос: почему эта ошибка обычно накапливается? Я не смог найти никакой реальной информации об этом в Интернете, поэтому, если кто-то может предоставить мне некоторую информацию, я был бы очень признателен.

Спасибо!

EDIT: внимательное прочтение отчета об ошибке показало мне, что эта ошибка действительно произошла во время заполнения объекта DataTable. Код выглядит примерно так:

DataTable.Clear();
try
{
    oledbdataAdapter.Fill(DataTable, sqlString);
}
 catch (Exception e)
{
    //error has occured, report
}

Кто-нибудь может понять это?

EDIT2: я только что подумал об этом ... Возможно ли, что это исключение будет вызвано тем, что в системе недостаточно системных ресурсов для завершения заполнения? Это единственная причина, по которой я могу придумать, что объясняет возникновение исключения. Это также объясняет, почему это происходит только на некоторых серверах и никогда не происходит на сервере разработки...

EDIT3: вот полное исключение на случай, если оно даст кому-то больше информации:

System.OverflowException: Arithmetic operation resulted in an overflow.
   at System.Data.DataTable.InsertRow(DataRow row, Int32 proposedID, Int32 pos, Boolean fireEvent)
   at System.Data.DataTable.LoadDataRow(Object[] values, Boolean fAcceptChanges)
   at System.Data.ProviderBase.SchemaMapping.LoadDataRow()
   at System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping)
   at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
   at System.Data.Common.DataAdapter.Fill(DataSet dataSet, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
   at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable)
   at INDAZajemService.INDAZajem.FillDataSet()

person David Božjak    schedule 16.07.2009    source источник


Ответы (5)


Если вы выполняете вычисления по агрегации данных, то это может привести к большим результатам, чем ожидается от структуры таблицы.

person Lima    schedule 16.07.2009

Обычно это происходит, когда у вас есть число, которое слишком велико или слишком мало, чтобы соответствовать определенному типу данных. Итак, если бы у вас было, скажем, число 120398018209571037 и вы попытались бы поместить его в Int32, вы бы получили эту ошибку. Вам нужно будет поместить в свой код дополнительную информацию о том, где это происходит, чтобы зафиксировать это. Удачи!

person Dave Markle    schedule 16.07.2009
comment
Спасибо. Мне это понадобится, так как это происходит крайне редко, и ожидается, что значения не будут приближаться к ограничениям их типов данных. - person David Božjak; 16.07.2009

Я решил проблему, когда использовал VS.Net 2013 с SQL Server в качестве бэкэнда. Просто установите в настройках сборки проекта значение «x86» вместо «Любой процессор». и вот вы идете. Но, конечно, сначала нужно проверить свои требования.

person Kamran    schedule 16.07.2016

Я делал выборку и заполнял DataAdapter результатами. Этот код находится внутри цикла, и до окончания цикла я очищаю свой DataTable: varDataTable.Clear().

ex:

varStrSQL = "select * from my_table where field_whatever = 2 and id_fk = 4"

varDataAdapter = New SqlDataAdapter(varStrSQL, MyConexion)
varDataAdapter.Fill(varDataTable)
varDataAdapter.Dispose()

Но после записи 65xxx я получил ошибку Arithmetic operation resulted in an overflow.

Я не уверен, но я думаю, что таблица данных была «размерена» с первоначальными результатами. Очевидно, мои первые записи были целыми числами.

Чтобы решить эту проблему, я не очищаю DataTableTasas, я выпускаю его следующим образом:

varDataTableTasas = Nothing
varDataTableTasas = New Data.DataTable

Надеюсь это поможет.

person Sebastián    schedule 22.09.2010

У меня была эта проблема, но только при подключении из веб-приложения, работающего под IIS. Решение в моем случае было:

  1. Откройте IIS
  2. Перейти к пулу приложений, используемому моим приложением
  3. Нажмите «Дополнительные настройки»
  4. Измените параметр «Включить 32-разрядные приложения» на «Истина».
  5. Нажмите «ОК»

Мне даже не пришлось перезапускать пул приложений, изменение сразу устранило проблему.

person JosephStyons    schedule 21.11.2016