SQL Server 存储过程出错,超时时间已过

Posted

技术标签:

【中文标题】SQL Server 存储过程出错,超时时间已过【英文标题】:Error in SQL Server stored procedure, timeout period elapsed 【发布时间】:2016-08-04 15:06:14 【问题描述】:

我正在尝试使用一个存储过程,在该过程中我发送通过 ADO.NET C# 代码发送的单个参数。

现在的问题是从我的开发环境调用存储过程,当我将它部署到生产环境时,我遇到 timeout elapse 异常并且它永远不会到达存储过程(我已添加日志以检查存储过程是否实际被命中以及在哪个阶段导致超时)。

异常:System.Data.SqlClient.SqlException (0x80131904):超时。在操作完成之前超时时间已过或服务器没有响应。 ---> System.ComponentModel.Win32Exception (0x80004005): 等待操作超时

在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔型 breakConnection,Action1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,布尔调用者HasConnectionLock,布尔异步关闭) 在 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean & dataReady) 在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,RunBehavior runBehavior,字符串 resetOptionsString) 在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,布尔异步,Int32 超时,任务和任务,布尔异步写入,SqlDataReader ds) 在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,String 方法,TaskCompletionSource1 completion, Int32 timeout, Task& task, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource1 完成,String methodName,布尔 sendToPipe,Int32 超时,布尔 asyncWrite) 在 System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 在 ProjectName.ViewModel.ClassViewModel.c__DisplayClasse.b__d()

我不知道生产服务器上发生了什么。请指导我解决这个问题。

对于相同的错误消息有很多问题,但我无法找到类似的问题场景,例如未执行存储过程,但仍会导致超时错误。

我会包含存储过程,但它是非常基本的存储过程。

请帮忙:)

谢谢, 尼基尔·查万。

【问题讨论】:

尝试在不使用应用程序的情况下直接运行存储过程,然后尝试通过注释查询的不同部分来找出问题所在,即说明哪个需要很长时间才能在服务器上运行跨度> 如果我从 sql server management studio 执行存储过程,它几乎不需要 3-4 秒。问题是当我尝试将它与 ADO.NET 代码一起使用时,根本没有执行存储过程。 尝试使用这个连接字符串 DataSource=server;InitialCatalog=databaseUserId=username;Password=password;Connect Timeout=0, 0 表示无限超时 @rashfmnb 如果尝试连接到错误的服务器,这将永远挂起应用程序 是的,我不能在生产服务器上冒险......对不起,我不能设置无限超时:) 【参考方案1】:

您是否尝试过在 SQLServer 中运行您的存储过程并检查它是否运行成功?

您是否尝试过设置 SqlCommand.CommandTimeout 属性?

您是否检查过您的连接字符串是否指向正确的数据库并且可以访问?

【讨论】:

这些都应该是cmets。 是的,我知道,但目前不允许添加 cmets。 然后等到可以。人们在发布 cmets 之前需要足够的代表是有原因的。这种情况甚至有一个固定的答案! 感谢@Nouman 通过阻止 SqlTransaction 回滚代码并查看存储过程在哪里超时并需要很长时间处理来获得解决方案。

以上是关于SQL Server 存储过程出错,超时时间已过的主要内容,如果未能解决你的问题,请参考以下文章

连接SQL SERVER 2008 R2显示超时间已到.在操作完成之前超时间已过或服务器未响应

sql2005用查询分析器还原数据库时出错提示超时

调用 SQL Server 存储过程的 SqlCommand 超时

.NET连接SQLServer返回数据时提示“超时时间已到。在操作完成之前超时时间已过或服务器未响应。” 附代码

标量函数在存储过程中使用时在 SQL Server 中发生请求超时问题

在 ASP.NET MVC 中执行 SQL Server 存储过程时如何防止超时错误?