1

我正在运行一项服务,该服务每分钟左右进行一些计算并与 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()
4

5 回答 5

2

如果您正在对数据的聚合进行计算,那么它似乎会产生比表结构预期的更大的结果。

于 2009-07-16T08:06:42.147 回答
1

当您的数字太大或太小而无法适应某种数据类型时,通常会发生这种情况。因此,如果您有数字 120398018209571037 并尝试将其放入 Int32 中,您会收到此错误。您需要在代码中添加更多关于发生这种情况的信息,以便确定它。祝你好运!

于 2009-07-16T08:08:22.503 回答
1

当我使用 VS.Net 2013 和 SQL Server 作为后端时,我解决了这个问题。只需将项目构建设置设置为“x86”而不是“任何 cpu”。你去吧。但当然,您需要先检查您的要求。

于 2016-07-16T10:00:42.043 回答
1

我遇到了这个问题,但仅在从 IIS 下运行的 Web 应用程序连接时。我的解决方案是:

  1. 打开 IIS
  2. 浏览到我的应用程序使用的应用程序池
  3. 点击“高级设置”
  4. 将选项“启用 32 位应用程序”更改为“真”
  5. 点击“确定”

我什至不必重新启动应用程序池,更改立即解决了问题。

于 2016-11-21T17:48:59.623 回答
0

我正在做一个选择并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()

但是在 65xxx 记录之后,我收到了错误Arithmetic operation resulted in an overflow

我不确定,但我认为数据表与初始结果是“维度的”。显然,我的第一条记录是整数。

为了解决这个问题,我没有清除 DataTableTasas,我将其发布如下:

varDataTableTasas = Nothing
varDataTableTasas = New Data.DataTable

希望这可以帮助。

于 2010-09-22T21:52:01.313 回答