早上好!
事先道歉,我知道已经有类似的问题被提出,但是我尝试解决它们并没有解决我的问题,因此发了这篇文章。
在贴出异常细节之前,这里是概述:
我有一个使用SQL Server(2005和2008r2)作为数据存储的.NET 4.0智能桌面应用程序。在数据库中,我有一张表格来记录实体何时被更改。这使得应用程序的其他实例可以检查更改并重新加载某些数据。该表格有三个字段:
Id [int], EntityName [nvarchar(4000)], ChangeDateTime [datetime]
Id是主键,并且ChangeDateTime字段上有一个索引。
为了使其工作,应用程序在特定时间间隔或执行某些操作时检查该表,以查看是否发生了更新,方法是检索某个实体的最新更改日期时间,并将其与内部存储的值进行比较。
查询如下:
Query: SELECT TOP(@p2) MAX([BondFM].[dbo].[EntityTypeChangedLog].[ChangeDateTime]) AS [ChangeDateTime] FROM [BondFM].[dbo].[EntityTypeChangedLog] WHERE ( [BondFM].[dbo].[EntityTypeChangedLog].[ChangedEntityTypeName] = @p3)
Parameter: @p2 : Int64. Length: 0. Precision: 0. Scale: 0. Direction: Input. Value: 1.
Parameter: @p3 : String. Length: 4000. Precision: 0. Scale: 0. Direction: Input. Value: "SampleEntityName".
所以表格只会从运行的应用程序中收到两种交互:
- 一个选择请求,如上所示,以检索实体的最新更新日期时间
- 当实体发生更改以添加新行时,会有一个插入请求
问题在于,在执行选择语句时,我会得到许多以下类型的异常。
Message : An exception was caught during the execution of a retrieval query: A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The specified network name is no longer available.).
有时它也会出现以下情况:
- TCP提供程序,错误:0 - 信号量超时期已过或
- TCP提供程序,错误:0 - 远程主机强制关闭了现有连接。
此外,我还获得了以下内部异常,这并没有帮助我缩小问题范围:
Inner Exception
---------------
Type : System.Data.SqlClient.SqlException, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Message : A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The specified network name is no longer available.)
Source : .Net SqlClient Data Provider
Help link :
Errors : System.Data.SqlClient.SqlErrorCollection
Class : 20
LineNumber : 0
Number : 64
Procedure :
Server : SQLServer
State : 0
ErrorCode : -2146232060
Data : System.Collections.ListDictionaryInternal
TargetSite : Void OnError(System.Data.SqlClient.SqlException, Boolean)
Stack Trace : at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
at System.Data.SqlClient.TdsParserStateObject.ReadBuffer()
at System.Data.SqlClient.TdsParserStateObject.ReadByte()
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.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteScalar()
at SD.LLBLGen.Pro.ORMSupportClasses.RetrievalQuery.ExecuteScalar()
我已经阅读并测试了多种与连接性有关的问题,但都没有帮助,我想知道是否有什么内部原因导致这个表格出现问题(例如锁定)?
感谢您的阅读和任何帮助或指示!
Mike