2009-07-16 124 views
0

我正在运行一个服务,它执行一些计算,并且每隔一分钟左右(24/7,正常运行时间非常重要)与ms sql服务器进行通信,如果发生任何有趣的事情(如超时或丢失连接),则会写入错误日志。sql错误“算术运算导致溢出。”

这个伟大的工程,但是在一段时间后,我会得到这个错误:

Arithmetic operation resulted in an overflow.

由于这是在客户端上运行,而且由于项目已经启动例外只发生了3次(一现在几个月),这将非常难以捕捉和调试。

我正在使用OleDbDataAdapter与服务器通信。从服务器收到的数据并不是特别的,至少我知道!数据不应超过字段大小等,所以我不能真正想到发生此错误的原因。再次,这是极端难以验证,因为我所得到的只是错误信息。

我的问题是:为什么这个错误通常会累积?我一直无法在网上找到任何有关它的真实信息,所以如果有人能够提供给我一些信息,那将非常感激。

谢谢!

编辑:仔细阅读错误报告,告诉我这个错误实际上是在填充DataTable对象期间发生的。代码看起来像这样:

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

任何人都可以理解这一点吗?

EDIT2:我刚刚想到这个......是否有可能抛出这个异常,因为系统没有足够的系统资源来完成填充?这是我能想到的解释发生异常的唯一原因。这也可以解释为什么只出现在某些服务器上,从来没有出现dev的服务器...

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

回答

2

如果你正在对数据进行聚合计算,然后它看起来会导致更大的结果,然后表结构期望。

1

它通常发生在您的数字太大或太小而无法放入某种数据类型时。所以,如果你的号码是120398018209571037,并且试图将它放到Int32中,你会得到这个错误。您需要在代码中添加更多关于发生这种情况的信息,以便将其锁定。祝你好运!

+0

谢谢。我将需要它,因为它发生在极端的后面,并且值不会在数据类型限制附近获得任何值。 – 2009-07-16 08:11:21

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

我不确定,但我认为datatable是“尺寸”的初始结果。显然,我的第一个记录是整数。

为了解决这个问题,我不清除DataTableTasas,我释放它,如下所示:

varDataTableTasas = Nothing 
varDataTableTasas = New Data.DataTable 

希望这有助于。

0

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

0

我有这个问题,但只有从IIS下运行的Web应用程序连接时。在我的情况的解决方案是:

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

我甚至没有重新启动应用程序池,更改将立即修复该问题。

相关问题