【问题标题】:How to diagnose ArgumentOutOfRangeException on SqlDbType?如何诊断 SqlDbType 上的 ArgumentOutOfRangeException?
【发布时间】:2009-03-13 15:22:51
【问题描述】:

我们的一些客户在使用我们的 .NET 2.0 胖客户端应用程序时遇到了从 SQL 2000 SP4 服务器读取数据时出现的奇怪的间歇性错误,而此时操作刚刚成功。我们有一些使用 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% 发生而不是暂时发生吗?

【问题讨论】:

    标签: .net sql-server thick-client


    【解决方案1】:

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

    这个问题也可能是 SQL-Server 方面的问题,在最近的版本中已经解决了。

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

    How to cancel a long-running Database operation?

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

    【讨论】:

      【解决方案2】:

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

      Structured
      Date
      Time
      DateTime2
      DateTimeOffset
      

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

      如果可能的话,我会在没有安装 3.5 的情况下在 2.0 下测试应用程序,看看你遇到了什么错误。这应该给你一个很好的起点。

      要找出错误点,我必须遍历枚举并查看项目在枚举中的顺序。 Reflector 是执行此操作的绝佳工具,但您必须在 2.0 系统和 3.5 系统上执行此操作才能看到更改。

      【讨论】:

      • 感谢您的良好开端。查看Reflector,值为8的SqlDbType是Int。如果从数据库中读取 Ints 时我的应用程序无法正常工作。如果它与框架版本相关联,它到底是如何发生的?它怎么会如此短暂?
      【解决方案3】:

      这个solution 可以解决你的问题:

      您的本地机器是否使用 SQL Server 2008,而另一个机器是 2005? @RUNTIME 参数是 SqlDbType.Time 类型。 SQL Server 2005 中不存在该类型。此外,如异常所述,SqlDbType.Time 的值为 32。您不能只存储 sql server 2008 之前的时间值。您必须将 @RUNTIME 存储为 2005 年的 SqlDbType.DateTime。

      如果你使用 .NET Framework 2.0 必须安装 .NET Framework 2.0 SP2 和 sql2008 来解决这个问题。

      【讨论】:

        猜你喜欢
        • 2011-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-05
        • 1970-01-01
        • 2015-08-25
        • 2010-11-27
        相关资源
        最近更新 更多