Sql错误“算术运算导致溢出。”

时间:2009-07-16 08:01:47

标签: c# sql sql-server oledb oledbexception

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

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

当您的数字太大或太小而无法容纳某种数据类型时,通常会发生这种情况。因此,如果你有120398018209571037这样的数字,并试图将它放入Int32,你会得到这个错误。您需要在代码中添加一些有关这种情况的更多信息,以便将其固定下来。祝你好运!

答案 2 :(得分: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

希望这有帮助。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

  1. 打开IIS
  2. 浏览到我的应用程序使用的应用程序池
  3. 点击“高级设置”
  4. 将“启用32位应用程序”选项更改为“True”
  5. 点击“确定”
  6. 我甚至没有重启应用程序池,更改立即解决了问题。