簡體   English   中英

如何在SqlDbType上診斷ArgumentOutOfRangeException?

[英]How to diagnose ArgumentOutOfRangeException on SqlDbType?

我們有一些使用.NET 2.0胖客戶端應用程序的客戶,在從SQL 2000 SP4 Server讀取數據時遇到奇怪的間歇性錯誤,這些操作在不久之前就成功了。 我們有一些使用SQL 2000的客戶(許多使用2005)沒有發生這些錯誤。

我注意到的一件事是,我們測試環境中的應用程序引用了System.Data 2.0.50727。 3053 ; 而該應用程序引用的是2.0.50727。 客戶系統上的1433 這兩個修訂版之間有什么區別,可能與以下所述的錯誤有關嗎?

這是錯誤的堆棧跟蹤的示例,其中枚舉值為8,但是我有更多實例,其中“越界”枚舉值為4或14,且具有相同的確切堆棧跟蹤。 枚舉值有時可以找到但在其他時候找不到嗎? 當應用程序的同一部分正確運行時該怎么辦?

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)

更新:我剛剛從客戶端的工作站之一下載了System.Data。 他們在GAC中有兩個版本,一個在GAC目錄中,一個在GAC_32目錄中。 在GAC中,版本號為1.14322.2365。 如上所述,在GAC_32中,版本號為2.0.50727.1433。 但是,在所有三個版本中,SqlDbType可枚舉將相同的int值映射到錯誤消息中的那些類型:

DateTime = 4
Int = 8
UniqueIdentifier = 14

恐怕該版本可能會引起麻煩:如果問題與框架版本有關,那么問題不應該在100%的時間內發生而不是暫時發生嗎?

您的客戶端在未安裝3.5的.NET 2.0上。 您的測試服務器是3.5。 在3.5中添加到枚舉的唯一內容是:

Structured
Date
Time
DateTime2
DateTimeOffset

這並不意味着沒有任何潛在的變化。

如果可能的話,我會在未安裝3.5的2.0下測試該應用程序,然后查看您遇到的錯誤。 那應該給您一個很好的起點。

為了弄清錯誤點,我將不得不遍歷枚舉並查看項在枚舉中的順序。 Reflector是執行此操作的好工具,但是您必須在2.0系統和3.5系統上都進行此操作才能查看更改。

這個古老的討論將類似的錯誤追溯到使用一個線程上創建的連接在另一個線程內運行查詢。 SqlConnection “不保證實例成員是線程安全的” 如果您的應用程序是多線程的,請確保正確使用了連接。

問題也可能是SQL-Server方面已在較新的版本中解決。

我在這里回答是因為在將SqlCommand.Cancel與SQL 2005一起使用時遇到了此錯誤。(除了“用戶取消操作”以外,還有一些例外情況,具體取決於取消查詢的時間。)我看到了作為“來自服務器的意外響應”錯誤...如果確實發生,則清除連接池可能是一個好主意。

如何取消長時間運行的數據庫操作?

使用連接池時如何強制SqlConnection物理關閉?

解決方案可以解決您的問題:

您的本地計算機使用的是SQL Server 2008,而其他計算機使用的是2005嗎? @RUNTIME參數的類型為SqlDbType.Time。 該類型在SQL Server 2005中不存在。正如異常所示,SqlDbType.Time的值也為32。 您不能只在SQL Server 2008之前存儲時間值。您必須在2005年將@RUNTIME存儲為SqlDbType.DateTime。

並且,如果您使用.NET Framework 2.0,則必須安裝.NET Framework 2.0 SP2和sql2008來解決此問題。

暫無
暫無

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

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