【问题标题】:Sql error "Arithmetic operation resulted in an overflow."Sql 错误“算术运算导致溢出。”
【发布时间】:2016-11-22 01:48:59
【问题描述】:

我正在运行一项服务,该服务每分钟左右(24/7,正常运行时间非常重要)进行一些计算并与 ms sql 服务器通信,如果发生任何有趣的事情(如超时或丢失连接),则会写入错误日志.

这很好用,但有时我会收到此错误:

算术运算导致溢出。

由于这是在客户端运行的,并且自项目启动以来(现在已经几个月)异常只发生了 3 次,因此很难捕获和调试。

我正在使用 OleDbDataAdapter 与服务器进行通信。从服务器接收的数据在任何方面都不是特别的,至少我知道!数据不应该超过字段大小等,所以我真的想不出这个错误发生的原因。同样,这非常难以验证,因为我得到的只是错误消息。

我的问题是:为什么通常会出现此错误?我一直无法在网上找到任何关于它的真实信息,所以如果有人能提供一些信息给我,我将不胜感激。

谢谢!

编辑:仔细阅读错误报告,我发现这个错误实际上是在填充 DataTable 对象期间发生的。代码如下所示:

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

谁能理解这个?

EDIT2:我刚想到这个……会不会因为系统没有足够的系统资源来完成Fill而抛出这个异常?这是我能想到的解释异常发生的唯一原因。它还可以解释为什么它只发生在某些服务器上而从不发生在开发服务器上......

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

【问题讨论】:

    标签: c# sql sql-server oledb oledbexception


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢。我将需要它,因为它发生在极端后面,并且值不会接近其数据类型限制。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

          我正在做一个选择并用结果填充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
          

          希望这会有所帮助。

          【讨论】:

            猜你喜欢
            • 2012-05-04
            • 2011-05-15
            • 1970-01-01
            • 2011-05-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多