使用 SqlDataAdapter 填充 DataTable 时,CommandTimeout 不起作用

Posted

技术标签:

【中文标题】使用 SqlDataAdapter 填充 DataTable 时,CommandTimeout 不起作用【英文标题】:CommandTimeout not working when using SqlDataAdapter to fill a DataTable 【发布时间】:2015-02-27 11:39:34 【问题描述】:

我将 CommandTimeout 设置为 1 秒,并且没有按预期抛出 TimeoutException。我正在运行的查询大约需要 7-8 秒。但是,当我使用 ExecuteReader 执行查询而不是尝试填充 DataTable 时,超时确实有效。在创建命令后以及创建 DataAdapter 后,我尝试设置 CommandTimeout。

using(SqlConnection con = new SqlConnection("data source=*****;user id==*****;password==*****;initial catalog==*****;"))

    string query = "select * from *****";

    SqlCommand command = new SqlCommand(query, con);
    //command.CommandTimeout = 1;

    CostingDataSet cds = new CostingDataSet();

    SqlDataAdapter da = new SqlDataAdapter(command);
    da.SelectCommand.CommandTimeout = 1;

    Stopwatch stopwatch = Stopwatch.StartNew();
        da.Fill(cds.CostingData);
    stopwatch.Stop();

    Console.WriteLine(stopwatch.ElapsedMilliseconds);

【问题讨论】:

Connection.Open() ? 【参考方案1】:

原因是发生在 SQLDataAdapter 中的魔法,坦率地说,这就是为什么它们是一个坏主意。

我的猜测是他们正在使用异步来执行填充,这将始终忽略命令超时。

我的建议:远离适配器,永远不要回头。它们没有那么有价值,而且会让一切变得更加混乱。

如果这不可能,请在连接字符串中设置连接超时,无论如何访问数据库,它都应该适用。

【讨论】:

不幸的是,我目前无法离开 SQLDataAdapter。但我以后会牢记这一点。我尝试使用 ConnectionTimeout 但这对命令执行时间没有影响。我还有一个客户端遇到了 5 分钟的默认超时。因此,无论出于何种原因,默认超时似乎都没有被覆盖。【参考方案2】:

像“select * from”这样的查询是个坏主意。

What is the reason not to use select *?

也就是说,也许您可​​以通过分页或类似方式限制要返回的数据量。减少返回的数据量会使其工作

【讨论】:

引用的代码来自我为隔离问题而创建的一个快速抽象的 VS 项目。 另外,减少数据将如何解决问题?我的问题是没有抛出超时异常。 @Ersl 对不起,我虽然你在谈论抛出异常。

以上是关于使用 SqlDataAdapter 填充 DataTable 时,CommandTimeout 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 SqlDataAdapter 填充 DataTable 时,CommandTimeout 不起作用

检测 SqlDataAdapter 填充方法何时完成

SqlDataAdapter 未填充 DataTable

带有表类型参数的存储过程返回数据但 SqlDataAdapter 不会填充

如何在 where 子句上基于 SqlCommand 或 SqlDataAdapter 填充 datagridview? SqlDataAdapter 不适用于哪里?

使用 SqlDataAdapter 用新名称填充数据集中的表,代码不完全运行且没有错误