C# 命令超时不工作
我正在尝试更改SqlCommand查询的超时,方法是测试给定连接字符串的连接。代码与此类似:C# 命令超时不工作,c#,sql,ado.net,C#,Sql,Ado.net,我正在尝试更改SqlCommand查询的超时,方法是测试给定连接字符串的连接。代码与此类似: using (SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand cmd = new SqlCommand("SELECT ...", connection); cmd.CommandTimeout = 10; connection.Open();
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上设置的值被忽略了
你知道为什么吗?我想你把SqlCommand.CommandTimeout
的确切用途弄糊涂了。根据:
获取或设置终止执行命令尝试并生成错误之前的等待时间
在您的例子中,您正在执行一个DataReader并逐步完成您的查询(不管它是什么)。每次Read()
都需要最少的时间,这就是为什么您不会达到超时的原因
编辑:
如果使用了错误的连接字符串,则您的
超时将不是命令超时,而是连接时间。这默认为15秒。这是在您的情况下有效的超时
方法调用将超时SqlConnection.Open()
,而不是SqlCommand.ExecuteReader()
。因此,ConnectionTimeout
属性将成为有效的超时值
您还需要检查默认为15秒的连接超时
另请参见-如果您的连接字符串具有上下文,则忽略CommandTimeout。在这种情况下,您可能需要更改您的命令。您也可以在配置文件中的连接字符串中指定:
<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>
不知道,但MSDN doco在声明中指出了一些可能被忽略的原因。一种是异步使用和使用BeginExecuteReader,这不是您的问题。但是,另一个是指超时“。当针对上下文连接(连接字符串中的“context connection=true”打开的SqlConnection)执行命令时无效。”“可能检查您的连接字符串,看看这是否是原因。是的,我检查了几次文档,以确保没有遗漏某些内容。无论如何,它不是异步读取器,连接字符串也没有任何上下文。与问题无关,但由于您使用的是“using”块,因此不需要执行connection.Close(),因为using块上的作用域结尾将自动关闭并处理您的连接。正如我在问题上所说的,我用一个错误的连接字符串来测试它,所以我实际上无法读取任何内容。正因为如此,我希望我的执行时间只是大约超时时间。@FlávioIvan啊,好的。我懂了。请看我的编辑。您的SqlCommand.CommandTimeout
不是在坏连接中用于超时的。这将是SqlConnection.ConnectionTimeout
属性。谢谢,Shark!我刚刚测试了它,现在我看到执行时间发生了变化。它仍然需要比我设置的超时时间更多的时间来运行,但现在我可以玩它了。:)“如果使用了错误的连接字符串”-->对此有何解决方法?我的连接字符串还具有“ConnectionTimeout”属性。我的连接字符串是“错误的连接字符串”吗?很抱歉,我忘记在问题中提到这一点,但我的连接字符串没有上下文。“您还需要检查连接超时,默认值为15秒。”+1