我们有一些使用我们的 .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% 发生而不是暂时发生吗?