当使用 SqlCommand 执行存储过程时,如何避免超时错误?

19

我有一个C#程序,它运行一个存储过程。如果我从Microsoft SQL Server Management Studio运行存储过程,它可以正常工作。它执行需要大约30秒。然而,如果我尝试从C#程序运行相同的存储过程,它会超时,尽管我已经在连接字符串中设置了超时时间为10分钟。

using (connection1 = new SqlConnection("user id=user_id_goes_here;password=password_goes_here;initial catalog=database_name_goes_here;data source=server_name_goes_here;connection timeout=600))

尽管我将其设置为允许10分钟(用于测试目的),但大约30秒后它似乎超时了。


1
你是如何调用这个过程的?从管理工具中需要30秒的操作,在C#中不应该需要10分钟,除非你在某个地方犯了错误,导致索引或统计信息出现问题。 - Joel Coehoorn
4个回答

30

连接超时仅适用于连接数据库。

SqlCommand 类有一个单独的 CommandTimeout 属性,使用该属性指定执行超时时间。

例如:

using (SqlCommand cmd = new SqlCommand())
{
  cmd.Connection = connection1;
  cmd.CommandTimeout = 240; //in seconds
  //etc...
}

9
如果使用0,意味着没有限制。 - Juan
2
只是想指出这只是解决问题的“临时措施”。最好通过解决根本问题来找出为什么首先会出现超时的情况。 - Chris Dunaway
1
@ChrisDunaway 我猜你从未处理过大型数据库?我曾经在项目中处理过整合了数千兆字节级别数据集的存储过程,有时候你只需要时间来完成这些事情。 - TomTom
1
@TomTom - 我同意,但你所描述的听起来更像是例外而不是规则。根据原帖,他们似乎不太可能处理那么多数据。更有可能的是他们只需要良好的索引和查询以及良好的执行计划。 - Chris Dunaway

6

使用SqlCommand.CommandTimeout属性设置命令超时时间,而不是在连接字符串中指定。

有关详细信息,请参见MSDN


2
你需要在代码中设置它,即通过设置 SQL 命令对象的 CommandTimeout 属性。
连接字符串中的参数“connection timeout”表示在终止尝试并生成错误之前等待建立连接的时间。这不是查询执行超时的时间。
谢谢,我几周前也遇到了同样的问题,并且对 webconfig 中的超时值与命令对象中的超时值感到困惑。你的问题现在已经解决了我的疑惑 :) 来自 MSDN 的参考链接

2

连接超时是指在实际连接到 SQL Server 时允许的时间。 命令超时是指命令运行允许的时间; 在本例中,是一个存储过程。 SqlCommand.CommandTimeout 是您要查找的属性。


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