Ошибка SQL «Арифметическая операция привела к переполнению». - PullRequest
0 голосов
/ 16 июля 2009

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

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

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

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

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

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

Спасибо!

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

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

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

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

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

Ответы [ 5 ]

2 голосов
/ 16 июля 2009

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

1 голос
/ 16 июля 2009

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

0 голосов
/ 21 ноября 2016

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

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

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

0 голосов
/ 16 июля 2016

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

0 голосов
/ 23 сентября 2010

Я делал выбор и заполнял 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...