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

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

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

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

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

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

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

Спасибо!

РЕДАКТИРОВАТЬ: тщательное чтение отчета об ошибках показало мне, что эта ошибка действительно произошла во время заполнения объекта DataTable. Код выглядит примерно так:

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

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

РЕДАКТИРОВАТЬ 2: Я только что подумал об этом... Возможно ли, что это исключение будет выброшено, потому что система не имеет достаточно системных ресурсов для завершения заполнения? Это единственная причина, по которой я могу придумать, объясняет возникновение исключения. Это также объясняет, почему это происходит только на некоторых серверах и никогда не происходит на сервере dev...

РЕДАКТИРОВАТЬ3: Вот целое исключение на случай, если это даст кому-либо больше понимания:

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()

5 ответов

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

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

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

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

Я решил проблему, когда я использовал VS.Net 2013 с SQL Server в качестве бэкэнда. Просто установите параметры сборки проекта на "x86" вместо "Any CPU". и там вы идете. Но, конечно, вы должны сначала проверить свои требования.

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

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

например:

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

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

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

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

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

varDataTableTasas = Nothing
varDataTableTasas = New Data.DataTable

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

Другие вопросы по тегам