命令超时(CommandTimeout)无效。

13

我正在尝试更改SqlCommand查询的超时时间,在测试给定连接字符串的连接的方法中。 代码类似于:

using (SqlConnection connection = new SqlConnection(connectionString))
    {
      SqlCommand cmd = new SqlCommand("SELECT ...", connection);
      cmd.CommandTimeout = 10;
      connection.Open();
      SqlDataReader reader = cmd.ExecuteReader();
      ...
      connection.Close();
    }
我希望在这里设置一个较短的超时时间,因为我只想测试一下这个连接字符串是否正确。但是,无论我将CommandTimeout设置为多少(我尝试过0、1、2、4、10、30、60、120),对于一个虚拟连接字符串获得的实际运行时间总是大约相同(约15秒)。所以,看起来我设置的CommandTimeout值由于某些原因被忽略了。有什么想法吗?

不清楚,但是在 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout.aspx 的MSDN文档中指出可能忽略命令超时的几个原因。其中一个是异步使用和使用BeginExecuteReader,这不是你的问题。然而另一个原因是超时“...当命令对上下文连接(在连接字符串中使用“context connection = true”打开的SqlConnection)执行时无效。”也许检查一下连接字符串是否是这个原因。 - Mr Moose
是的,我检查了文档几次,以确保我没有漏掉任何内容。无论如何,它既不是异步读取器,也没有连接字符串上下文。 - Flávio Ivan
虽然与问题无关,但由于您正在使用“using”块,因此不需要在作用域的末尾执行connection.Close(),因为using块的结束会自动关闭和处理您的连接。 - Sudhanshu Mishra
4个回答

7
我认为你混淆了SqlCommand.CommandTimeout的确切用途。根据MSDN参考资料

获取或设置在终止尝试执行命令并生成错误之前的等待时间。

在你的情况下,你正在执行一个DataReader并遍历查询(无论它是什么)。每个Read()所需的时间很短,这就是为什么你不会超时的原因。 编辑: 如果你使用了错误的连接字符串,则Timeout将不是命令超时,而是连接时间。这默认为15秒。这是你目前情况下有效的超时时间。
你将在方法调用SqlConnection.Open()上超时,而不是SqlCommand.ExecuteReader()。因此,ConnectionTimeout属性将是有效的超时值。 SqlConnection.ConnectionTimeout 属性 MSDN 参考

重点是,正如我在问题中所说的那样,我正在使用错误的连接字符串进行测试,因此我实际上无法读取任何内容。因此,我预计我的执行时间只会大约等于超时时间。 - Flávio Ivan
@FlávioIvan 啊,好的。我明白了。请看我的编辑。你的SqlCommand.CommandTimeout属性不是用于处理连接超时。这将是SqlConnection.ConnectionTimeout属性。 - user596075
谢谢,Shark!我刚刚测试了一下,现在我看到执行时间在变化。它仍然需要比我设置的超时时间更长的运行时间,但现在我可以尝试调整它。 :) - Flávio Ivan
如果您使用了错误的连接字符串,那么应该如何修复呢?我的连接字符串也有“ConnectionTimeout”属性。那么,我的连接字符串算是“错误的连接字符串”吗? - sports

1

抱歉,我在问题中忘记提到了,但是我没有关于连接字符串的上下文信息。 - Flávio Ivan
你还需要检查连接超时时间,它的默认值为15秒。 - Tim Lehner

0

你也可以在配置文件的连接字符串中指定:

<connectionStrings>
  <add name="*con_name*" connectionString="data source=*dsource*;initial catalog=*catalog*;integrated security=True;Connect Timeout=300;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings>

0

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