使用DbDataAdapter.Fill忽略CommandTimeout

时间:2015-04-13 22:50:50

标签: c# connection-timeout command-timeout sqldatadapter

我似乎无法让CommandTimeout在下面的代码中工作。我将超时值设置为1秒只是为了测试以确保它有效但似乎被忽略了。 SELECT语句运行大约需要15秒,并且运行完成。我期待1秒后发生超时异常。我在互联网上搜索了一个如何做到这一点的例子,但我找不到任何东西。我做错了什么?

DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.SqlClient");
DataSet dataSet = new DataSet();
DbCommand command = factory.CreateCommand();
command.Connection = factory.CreateConnection();
command.Connection.ConnectionString = "Server=localhost;Database=MyDatabase;User Id=;Password=****";
command.CommandType = CommandType.Text;
command.CommandText = "SELECT * FROM table";
command.CommandTimeout = 1;

using (DbDataAdapter adapter = factory.CreateDataAdapter())
{
    adapter.SelectCommand = command;
    adapter.Fill(dataSet);
}


更新: 我写了一个SELECT命令,运行时间超过30秒。这也不会超时。我甚至评论了我的CommandTimeout行,它仍然运行完成。因此,似乎甚至忽略了30秒的默认CommandTimeout。我很难过......任何帮助都会非常感激。


更新: 我想我可能已经弄明白了。当我写一个非常复杂的SELECT语句时,似乎发生了命令超时异常。我只能猜测发生了什么,使用我的简单SELECT命令,执行命令所需的时间不到1秒,但是加载数据集需要15秒。我在这里走在正确的轨道上吗?这看起来有可能吗?

1 个答案:

答案 0 :(得分:0)

命令超时是命令执行或处理结果期间所有网络读取的累积超时(对于在方法调用期间读取的所有网络数据包)。返回第一行后仍可能发生超时,并且不包括用户处理时间,仅包括网络读取时间。

例如,如果30秒超时,如果Read需要两个网络数据包,那么它有30秒的时间来读取两个网络数据包。如果再次调用Read,则还需要30秒才能读取所需的任何数据。

注意:
对上下文连接(在连接字符串中使用“context connection = true”打开的SqlConnection)执行命令时,或者在异步方法调用(如BeginExecuteReader)期间使用时,CommandTimeout无效。