0

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

4

3 回答 3

3

这个古老的讨论跟踪了一个类似的错误,即使用在一个线程上创建的连接在不同的线程中运行查询。SqlConnection “不保证实例成员是线程安全的”。如果您的应用程序是多线程的,请确保正确使用连接。

该问题也可能是 SQL-Server 端已在较新版本中解决的问题。

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

如何取消长时间运行的数据库操作?

如何在使用连接池时强制 SqlConnection 物理关闭?

于 2011-11-07T16:21:21.463 回答
2

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

Structured
Date
Time
DateTime2
DateTimeOffset

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

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

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

于 2009-03-13T15:31:12.173 回答
0

解决方案可能会解决您的问题:

您的本地机器是否使用 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 来解决这个问题。

于 2013-09-29T09:59:01.493 回答