簡體   English   中英

SQL錯誤“算術運算導致溢出。”

[英]Sql error “Arithmetic operation resulted in an overflow.”

我正在運行一項服務,該服務執行一些計算並每分鍾左右(24/7,正常運行時間非常重要)與ms sql服務器通信,並且如果發生任何有趣的事情(例如超時或連接斷開),則將其寫入錯誤日志。

這很好用,但是偶爾我會得到這個錯誤:

算術運算導致溢出。

由於這是在客戶端運行的,並且自從項目啟動以來(現在幾個月)僅發生了3次異常,因此很難捕獲和調試。

我正在使用OleDbDataAdapter與服務器通信。 從服務器接收到的數據在任何方面都不是特殊的,至少我知道! 數據不應超過字段大小等,因此我真的無法想到發生此錯誤的原因。 再一次,這很難驗證,因為我得到的只是錯誤消息。

我的問題是:為什么通常會出現此錯誤? 我一直無法在網上找到有關它的任何真實信息,因此,如果有人可以向我提供一些信息,將不勝感激。

謝謝!

編輯 :仔細閱讀錯誤報告后,我發現該錯誤實際上是在DataTable對象的填充過程中發生的。 代碼看起來像這樣:

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

任何人都可以理解嗎?

EDIT2 :我剛剛想到了這一點...是否可能因為系統沒有足夠的系統資源來完成Fill而引發此異常? 這是我能想到的唯一可以解釋發生異常的原因。 它還將解釋為什么它僅在某些服務器上發生而從不在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()

如果您要對數據的聚合進行計算,那么看起來會導致更大的結果,這是表結構所期望的。

當您的數字太大或太小而無法容納某種數據類型時,通常會發生這種情況。 因此,如果您有數字120398018209571037,並嘗試將其放入Int32中,則會收到此錯誤。 您需要在代碼中放入一些更多有關此情況發生的信息,以便進行鎖定。 祝好運!

我正在做一個選擇,並用結果填充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

希望這可以幫助。

當我將VS.Net 2013與SQL Server用作后端時,我解決了該問題。 只需將項目構建設置設置為“ x86”,而不是“ Any cpu”。 然后你去。 當然,您首先需要檢查您的需求。

我遇到了這個問題,但是僅當從在IIS下運行的Web應用程序進行連接時才出現。 我的解決方案是:

  1. 打開IIS
  2. 瀏覽到我的應用程序使用的應用程序池
  3. 點擊“高級設置”
  4. 將選項“啟用32位應用程序”更改為“真”
  5. 點擊“確定”

我什至不必重啟應用程序池,更改立即解決了該問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM