Ошибка 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. Решение в моем случае было:
- Откройте IIS
- Перейдите к пулу приложений, используемому моим приложением
- Нажмите "Дополнительные настройки"
- Измените параметр "Включить 32-разрядные приложения" на "True"
- Нажмите "ОК"
Мне даже не пришлось перезагружать пул приложений, изменения сразу решили проблему.
Я решил проблему, когда я использовал 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
Надеюсь это поможет.