我正在运行一项服务,该服务每分钟左右进行一些计算并与 ms sql 服务器通信(24/7,正常运行时间非常重要),如果发生任何有趣的事情(如超时或丢失连接),则会写入错误日志。
这很好用,但是有时我会收到此错误:
算术运算导致溢出。
由于这是在客户端运行的,并且自项目启动(现在几个月)以来仅发生了 3 次异常,因此很难捕获和调试。
我正在使用 OleDbDataAdapter 与服务器通信。从服务器接收的数据在任何方面都不是特别的,至少我知道!数据不应该超过字段大小等,所以我真的想不出发生这个错误的原因。同样,这非常难以验证,因为我得到的只是错误消息。
我的问题是:为什么这个错误通常会产生?我一直无法在网上找到任何关于它的真实信息,所以如果有人可以向我提供一些信息,那将非常感激。
谢谢!
编辑:仔细阅读错误报告表明,此错误实际上是在填充 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()