Я запускаю службу, которая выполняет некоторые вычисления и связывается с сервером 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()