如何诊断SqlDbType上的ArgumentOutOfRangeException?

时间:2009-03-13 15:22:52

标签: .net sql-server thick-client

我们有一些客户使用我们的.NET 2.0胖客户端应用程序,这些应用程序在从SQL 2000 SP4服务器读取数据时遇到奇怪的,间歇性的错误,这些错误很快就会成功。我们有一些客户使用SQL 2000(许多使用2005),这些错误不会发生。

我注意到的一件事是我们测试环境中的应用程序引用了System.Data 2.0.50727。 3053 ;而应用程序在客户的系统上引用了2.0.50727。 1433 。这两个版本有什么区别,可能与下面描述的错误有关吗?

以下是错误堆栈跟踪的示例,其中枚举值为8,但是我有更多实例,其中“out of bounds”枚举值为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 个答案:

答案 0 :(得分:2)

您的客户端是在没有安装3.5的.NET 2.0上。您的测试服务器是3.5。添加到3.5中的枚举的唯一内容是:

Structured
Date
Time
DateTime2
DateTimeOffset

这并不意味着没有一些潜在的变化。

如果可能的话,我会在没有安装3.5的情况下测试2.0以下的应用,看看你得到了什么错误。这应该是你开始的好地方。

为了找出错误点,我将不得不遍历枚举并查看枚举中项目的顺序。 Reflector是一个很好的工具,但你必须在2.0系统和3.5系统上都能看到这些变化。

答案 1 :(得分:2)

This ancient discussion跟踪类似的错误,直到使用在一个线程上创建的连接在另一个线程中运行查询。 SqlConnection "instance members are not guaranteed to be thread safe"。如果您的应用程序是多线程的,请确保正确使用连接。

问题也可能是SQL-Server方面已在更新版本中解决的问题。

我在这里回答是因为我在使用带有SQL 2005的SqlCommand.Cancel时遇到了这个错误。(除了'取消用户操作'之外,还有一些例外,取决于取消查询的时间。)我将其视为“来自服务器的意外响应”错误......如果确实发生连接池,则清除连接池可能是个好主意。

How to cancel a long-running Database operation?

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

答案 2 :(得分:0)

solution可能会解决您的问题:

  

您的本地方框是否使用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才能解决此问题。