sql-server-2005 - 过程从 ADO.NET 超时,但不在 SSMS 中

标签 sql-server-2005 ado.net timeout ssms sqlexception

我有一个存储过程,由于我从代码运行它时超时(超时设置为 30),它给了我一个 SqlException。当我直接在 Management Studio 中运行该过程时,它会在 1 秒内执行。我也只在针对特定数据库运行它时得到超时。当我使用其他数据库时,它会快速完成而没有错误。这是完整的错误消息:

System.Data.SqlClient.SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
   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.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.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)

这个堆栈跟踪对任何人都有意义吗?看起来我的 sproc 可能已完成并且在尝试读取某种元数据时超时?

我尝试在进程运行时查看它,但它已暂停。 sys.dm_os_waiting_tasks 将等待类型显示为 IO_COMPLETION,如果这有任何用处。我使用 sp_who2 'active' 在数据库上看到的唯一进程是超时和我的事件 SSMS 窗口,所以我认为这不是阻塞问题。我验证了这个数据库与工作数据库具有相同的索引,并且运行 dbcc checkdb 没有任何错误。如何确定超时的原因?

最佳答案

您可以将超时的 session 的 SET 选项与未超时的 session 的 SET 选项进行比较:

SELECT
    session_id,
    [ansi_defaults],
    [ansi_null_dflt_on],
    [ansi_nulls],
    [ansi_padding],
    [ansi_warnings],
    [arithabort],
    [concat_null_yields_null],
    [deadlock_priority],
    [quoted_identifier],
    [transaction_isolation_level]
FROM
    sys.dm_exec_sessions
WHERE
    session_id IN (<spid1>, <spid2>);

当您发现一些不同时,请尝试将 SSMS 查询中的每个设置更改为相反的设置,直到超时(或在发送查询之前手动设置应用程序代码中的选项)。现在,我手边没有 2005 年的实例,所以还没有测试这个查询。您可能需要注释掉一个或多个列名称。

关于sql-server-2005 - 过程从 ADO.NET 超时,但不在 SSMS 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7096728/

相关文章:

database - 如何使用 DataSet 将数据从一个数据库传输到另一个数据库?

python - 使用模块 'subprocess' 超时

optimization - Z3 优化超时

sql - 用于识别由单个重复字符/数字组成的 varchar 字段的 T-SQL 查询?

visual-studio-2008 - 内置数据库

ruby-on-rails - 将 Rails 应用程序从 Windows 连接到 SQL Server 2005

c# - 读取500万条记录,最后更新一个专栏

excel - 使用 OleDbConnection::GetOleDbSchemaTable() 列出 excel 表

c++ - 类似于 c++ 的 setTimeout 功能

sql - 通过SQL SP映射到网络驱动器