2009-07-16 8 views
0

Ich führe einen Dienst, der einige Berechnungen durchführt und jede Minute mit einem ms sql Server kommuniziert (24/7, Betriebszeit ist sehr wichtig) und schreibt in das Fehlerprotokoll, wenn etwas Lustiges passiert (wie ein Timeout oder eine verlorene Verbindung).SQL-Fehler "Arithmetische Operation führte zu einem Überlauf."

Dies funktioniert gut, wenn aber in einer Weile werde ich diese Fehlermeldung erhalten:

Arithmetic operation resulted in an overflow.

Da dies auf Kundenseite ausgeführt wird, und die Ausnahme aufgetreten ist nur 3-mal, da das Projekt ins Leben gerufen worden ist (a einige Monate jetzt) ​​wäre es extrem schwer zu fangen und zu debuggen.

Ich verwende OleDbDataAdapter, um mit dem Server zu kommunizieren. Die Daten, die vom Server empfangen werden, waren in keiner Weise besonders, die mir zumindest bekannt sind! Daten sollten niemals Feldgrößen usw. überschreiten, daher kann ich mir keinen Grund für diesen Fehler vorstellen. Auch dies ist extrem schwer zu überprüfen, da ich nur die Fehlermeldung bekomme.

Meine Frage ist: Warum fällt dieser Fehler normalerweise? Ich konnte im Web keine wirklichen Informationen darüber finden, und wenn jemand mir Informationen liefern könnte, würde das sehr geschätzt werden.

Vielen Dank!

BEARBEITEN: Ein sorgfältiges Durchlesen des Fehlerberichts zeigte mir, dass dieser Fehler tatsächlich während des Fill of DataTable-Objekts aufgetreten ist. Code sieht in etwa so aus:

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

Kann jemand Sinn machen?

EDIT2: Ich habe gerade daran gedacht ... Ist es möglich, diese Ausnahme würde ausgelöst werden, weil das System nicht genügend Systemressourcen hat, um die Füllung zu vervollständigen? Dies ist der einzige Grund, warum ich mir das vorstellen kann, um die aufgetretene Ausnahme zu erklären. Es würde auch erklären, warum es tritt nur auf einigen Servern und tritt nie auf dev-Server ...

EDIT3: Hier wird die ganze Ausnahme ist, falls es jemand noch mehr Einblick gibt:

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

Antwort

2

Wenn Wenn Sie Berechnungen für Aggregationen der Daten durchführen, scheint dies zu größeren Ergebnissen zu führen, als die Tabellenstruktur erwartet.

1

Normalerweise passiert es, wenn Sie eine Zahl haben, die zu groß oder zu klein ist, um in einen bestimmten Datentyp zu passen. Also, wenn Sie sagen, die Nummer 120398018209571037 und versucht, es in ein Int32 zu setzen, würden Sie diesen Fehler erhalten. Sie müssen einige Informationen in Ihren Code eingeben, um herauszufinden, wo dies geschieht, um es festzuhalten. Viel Glück!

+0

Vielen Dank. Ich werde es brauchen, da es extrem hinten passiert und Werte nicht erwartet werden, ihren Dateitypbeschränkungen irgendwie zu nähern. –

0

Ich machte eine Auswahl und füllt eine DataAdapter mit den Ergebnissen. Dieser Code befindet sich in einer Schleife und vor dem Ende der Schleife lösche ich meine DataTable: varDataTable.Clear().

ex:

varStrSQL = "select * from my_table where field_whatever = 2 and id_fk = 4" 

varDataAdapter = New SqlDataAdapter(varStrSQL, MyConexion) 
varDataAdapter.Fill(varDataTable) 
varDataAdapter.Dispose() 

Aber nach 65xxx Aufzeichnungen erhielt ich den Fehler Arithmetic operation resulted in an overflow.

Ich bin mir nicht sicher, aber ich denke, die Datentabelle wurde mit den ersten Ergebnissen "dimensioniert". Offensichtlich waren meine ersten Aufzeichnungen ganze Zahlen.

Um dies zu lösen ich nicht klar, die DataTableTasas, ich loslassen wie folgt:

varDataTableTasas = Nothing 
varDataTableTasas = New Data.DataTable 

Hoffnung, das hilft.

0

Ich löste das Problem, wenn ich VS.Net 2013 mit SQL Server als Backend verwendete. Legen Sie einfach die Projekt-Build-Einstellungen auf "x86" statt "Any cpu". und da gehst du. Aber natürlich müssen Sie zuerst Ihre Anforderungen überprüfen.

0

Ich hatte dieses Problem, aber nur beim Herstellen einer Verbindung von einer Webanwendung, die unter IIS ausgeführt wird. Die Lösung in meinem Fall war:

  1. Öffnen Sie IIS
  2. Wechseln Sie zu dem Anwendungspool von meiner Anwendung verwendet
  3. Klicken Sie auf "Erweiterte Einstellungen"
  4. Ändern Sie die Option "Enable 32-Bit-Anwendungen" auf " True“
  5. Klicken Sie auf‚OK‘

ich nicht einmal den Anwendungspool neu gestartet werden musste, fixiert die Änderung das Problem sofort.

Verwandte Themen