【问题标题】:CommandTimeout not working命令超时不起作用
【发布时间】:2012-02-24 14:31:43
【问题描述】:

我正在尝试更改 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 上设置的值由于某种原因被忽略了。

有什么想法吗?

【问题讨论】:

  • 不知道,但msdn.microsoft.com/en-us/library/… 的 MSDN 文档说明了它可能被忽略的几个原因。一种是异步使用和使用 BeginExecuteReader 这不是你的问题。然而,另一个是指超时“..当针对上下文连接执行命令时没有效果(在连接字符串中使用“context connection=true”打开的 SqlConnection)。”也许检查你的连接字符串,看看这是否是原因。
  • 是的,我检查了几次文档以确保我没有遗漏任何内容。无论如何,不​​是异步阅读器,连接字符串也没有任何上下文。
  • 与问题无关,但由于您使用的是“使用”块,因此您无需执行 connection.Close(),因为 using 块上的范围结束会自动关闭并处理您的连接

标签: c# sql ado.net


【解决方案1】:

我认为您对 SqlCommand.CommandTimeout 的确切用途感到困惑。根据this MSDN reference

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

在您的情况下,您正在执行 DataReader 并单步执行您的查询(无论它可能是什么)。每个Read() 花费的时间最少,这就是您不会超时的原因。

编辑

如果您使用了错误的连接字符串,您的Timeout 将不是命令超时,而是连接时间。这默认为 15 秒。这是对您的情况有效的超时。

您将在方法调用 SqlConnection.Open() 上超时,而不是 SqlCommand.ExecuteReader()。因此ConnectionTimeout 属性将成为有效的超时值。

SqlConnection.ConnectionTimeout Property MSDN Reference

【讨论】:

  • 关键是,正如我在问题上所说,我正在使用错误的连接字符串进行测试,所以我实际上无法阅读任何内容。因此,我预计我的执行时间只是超时时间。
  • @FlávioIvan 啊,好的。我知道了。请看我的编辑。您的SqlCommand.CommandTimeout 不会用于连接不良时的超时。那将是 SqlConnection.ConnectionTimeout 属性。
  • 谢谢,鲨鱼!我刚刚对其进行了测试,现在我看到执行时间发生了变化。它的运行时间仍然比我设置的超时时间长,但现在我可以玩它了。 :)
  • "如果您使用了错误的连接字符串" ---> 解决方法是什么?我的连接字符串也有“ConnectionTimeout”属性。我的连接字符串是“错误的连接字符串”吗?
【解决方案2】:

您还需要检查默认为 15 秒的连接超时。

另见http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout.aspx - 如果您的连接字符串有上下文,则忽略 CommandTimeout

【讨论】:

  • 抱歉,忘记在问题中提及这一点,但我的连接字符串上没有上下文。
  • "您还需要检查连接超时,默认为 15 秒。" +1
【解决方案3】:

在这种情况下,您可能需要更改您的 SqlConnection.ConnectionTimeout

【讨论】:

    【解决方案4】:

    您也可以在配置文件中的连接字符串中指定这一点:

    <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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 2012-08-16
      相关资源
      最近更新 更多