SQL Server异常:TCP提供程序,错误:0 - 指定的网络名称不再可用。

19

早上好!

事先道歉,我知道已经有类似的问题被提出,但是我尝试解决它们并没有解决我的问题,因此发了这篇文章。

在贴出异常细节之前,这里是概述:

我有一个使用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


3
看起来像是网络出了问题,或者服务器上下起伏。或许是安装有问题。我会查看Windows事件和SQL Server日志以获取更多线索。 - Tony Hopkinson
另一个可能的原因是SQL Server在数据库中发现错误并终止了连接。我见过这种情况发生。运行DBCC CHECKDB以确保安全。 - usr
http://social.msdn.microsoft.com/Forums/sqlserver/en-US/8d55644b-96ba-449b-ac35-403e7fdd71a2/maintenance-plan-for-db-backup-failed-with-the-error-64the-specified-network-name-is-no-longer?forum=sqldatabaseengine - chengbo
这是远程 SQL Server 还是本地 SQL Server?可以暂时将数据传输到本地 SQL Server,看看是否仍然出现错误? - Nick.McDermaid
2个回答

5

您可以尝试在连接字符串中增加连接超时时间。

    private static void OpenSqlConnection()
     {
        string connectionString = GetConnectionString();
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
          connection.Open();
          Console.WriteLine("State: {0}", connection.State);
          Console.WriteLine("ConnectionTimeout: {0}",
          connection.ConnectionTimeout);
        }
     }

     static private string GetConnectionString()
     {
      // To avoid storing the connection string in your code,  
      // you can retrieve it from a configuration file, using the  
     // System.Configuration.ConfigurationSettings.AppSettings property  
        return "Data Source=(local);Initial Catalog=AdventureWorks;"
      + "Integrated Security=SSPI;Connection Timeout=30";
    }

2

问题原因

该错误是由于长时间运行的查询的超时异常引起的。在以前的Visual Studio .NET版本中,该异常被正确表示为带有超时描述的异常。

解决方法

将命令对象的commandtimeout属性设置为适当的值。使用零值等待而不抛出异常。

https://support.microsoft.com/nl-nl/kb/555938


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接