2009-03-13 12 views
0

Wir haben einige Kunden, die unsere .NET 2.0-Thick-Client-App verwenden, die seltsame, zeitweilige Fehler beim Lesen von Daten von einem SQL 2000 SP4-Server erfahren, bei denen die Aktionen nur wenige Augenblicke früher ausgeführt wurden. Wir haben einige Kunden, die SQL 2000 verwenden (und viele, die 2005 verwenden), wo diese Fehler nicht auftreten.Wie kann man ArgumentOutOfRangeException auf SqlDbType diagnostizieren?

Eine Sache, die ich bemerke, ist, dass die App in unseren Testumgebungen System.Data 2.0.50727 verweist. ; während die App 2.0.50727 verweist. auf den Systemen des Kunden. Was ist der Unterschied zwischen diesen beiden Revisionen und könnte es sich auf die unten beschriebenen Fehler beziehen?

Hier ist ein Beispiel für die Stapelverfolgung des Fehlers, wo der Aufzählungswert 8 ist, aber ich habe viel mehr Instanzen, wo der Enumerationswert "out of bounds" 4 oder 14 mit der gleichen genauen Stack-Ablaufverfolgung ist. Sind die Aufzählungswerte manchmal auffindbar, aber nicht zu anderen Zeiten? Was ist, wenn der gleiche Teil der App ohne Fehler läuft?

TYPE: System.ArgumentOutOfRangeException 
MSG: The SqlDbType enumeration value, 8, is invalid. 
Parameter name: SqlDbType 
SOURCE: System.Data 
SITE: GetSqlDataType 

at System.Data.SqlClient.MetaType.GetSqlDataType(Int32 tdsType, UInt32 userType, Int32 length) 
at System.Data.SqlClient.TdsParser.CommonProcessMetaData(TdsParserStateObject stateObj, _SqlMetaData col) 
at System.Data.SqlClient.TdsParser.ProcessMetaData(Int32 cColumns, TdsParserStateObject stateObj) 
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 
at System.Data.SqlClient.SqlDataReader.ConsumeMetaData() 
at System.Data.SqlClient.SqlDataReader.NextResult() 
at Ceoimage.Basecamp.Data.Document._GetDocumentModelWithCollections(IDataReader rdr) 

Update: ich System.Data von einem der Arbeitsplätze der Kunden gerade heruntergeladen haben. Sie hatten zwei Versionen im GAC, einen im GAC-Verzeichnis und einen im GAC_32-Verzeichnis. In GAC lautet die Versionsnummer 1.14322.2365. In GAC_32 ist die Versionsnummer 2.0.50727.1433, wie oben beschrieben. In allen drei Versionen jedoch die SqlDbType enumerable ordnet die gleichen int-Werte zu den gleichen Typen für die in den Fehlermeldungen:

DateTime = 4 
Int = 8 
UniqueIdentifier = 14 

Ich bin die Version Angst könnte eine falsche Fährte sein: wenn das Problem zu tun hat Bei Framework-Versionen sollte das Problem nicht zu 100% auftreten, sondern nur vorübergehend sein?

Antwort

2

Ihr Client ist auf .NET 2.0 ohne 3.5 installiert. Ihre Testserver sind 3.5. Die einzigen Dinge, die der Aufzählung in 3.5 hinzugefügt wurden, sind:

Structured 
Date 
Time 
DateTime2 
DateTimeOffset 

Dies bedeutet nicht, dass es keine grundlegenden Änderungen gibt.

Wenn möglich, würde ich die App unter 2.0 ohne 3.5 installiert testen und sehen, welche Fehler Sie bekommen. Das sollte dir einen guten Startpunkt geben.

Um den Fehlerpunkt herauszufinden, müsste ich die Aufzählung durchlaufen und sehen, in welcher Reihenfolge die Elemente in der Enumeration sind. Reflektor ist ein großartiges Werkzeug, um dies zu tun, aber Sie müssen es sowohl auf einem 2.0-System als auch auf einem 3.5-System tun, um die Änderungen zu sehen.

+0

Danke für den guten Start. Beim Betrachten von Reflector ist SqlDbType mit dem Wert 8 Int. Meine App würde nicht funktionieren, wenn es Probleme beim Lesen von Ints aus der Datenbank hat. Wie in der Welt passiert es und wie kann es so transient sein, wenn es an die Framework-Version gebunden ist? – flipdoubt

2

This ancient discussion verfolgt einen ähnlichen Fehler bis zur Verwendung einer Verbindung, die in einem Thread erstellt wurde, um eine Abfrage in einem anderen Thread auszuführen. SqlConnection "instance members are not guaranteed to be thread safe". Wenn Ihre Anwendung ein Multi-Threading-Programm ist, vergewissern Sie sich, dass die Verbindungen ordnungsgemäß verwendet werden.

Das Problem kann auch etwas SQL-Server-Seite sein, die in neueren Versionen behoben wurde.

Ich antworte hier, weil ich diesen Fehler bei der Verwendung von SqlCommand.Cancel mit SQL 2005 aufgetreten bin. (Es gibt eine Handvoll Ausnahmen, zusätzlich zu "Vorgang vom Benutzer abgebrochen" abhängig davon, wann die Abfrage abgebrochen wird.) Ich sehe es als eine "unerwartete Antwort vom Server" -Fehler ... es ist wahrscheinlich eine gute Idee, den Verbindungspool zu löschen, wenn es passiert.

How to cancel a long-running Database operation?

How to force a SqlConnection to physically close, while using connection pooling?

0

diese solution kann Ihr Problem lösen:

Ist Ihr lokales Feld SQL Server 2008 verwenden, aber das andere Feld ist 2005? Der Parameter @RUNTIME hat den Typ SqlDbType.Time. Dieser Typ ist in SQL Server 2005 nicht vorhanden. Auch SqlDbType.Time hat einen Wert von 32, wie die Ausnahme sagt. Sie können nicht nur Zeitwerte vor SQL Server speichern 2008. Sie haben @RUNTIME als SqlDbType.DateTime

im Jahr 2005 zu speichern Und wenn Sie .NET Framework 2.0 Verwendung verwenden müssen .NET Framework installieren 2.0 SP2 und sql2008, um dieses Problem zu lösen.