使用SqlDataAdapter填充DataTable时CommandTimeout无效。

3

我将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()? - Kiquenet
2个回答

1
造成这种情况的原因是SQLDataAdapter中发生的神奇事件,这也是它们为什么是个坏主意的原因。我猜测他们正在使用异步来执行填充操作,这将始终忽略命令超时。我的建议是:远离适配器,并永远不要回头。它们并不那么有价值,而且会使一切变得更加混乱。如果不可能,可以在连接字符串中设置连接超时时间,这样无论如何访问数据库都应该适用。

很遗憾,我现在无法放弃使用SQLDataAdapter。但是我会将这个问题记在心里,以备将来参考。我已经尝试使用ConnectionTimeout,但它对命令执行时间没有影响。我还有一个客户因为达到默认的5分钟超时而受到影响。所以不管出于什么原因,似乎默认的超时时间没有被覆盖。 - Ersl

0

像 "select * from" 这样的查询是一个不好的主意。

为什么不要使用 select *?

话虽如此,也许你可以通过分页或类似的方式限制返回的数据量。减少返回的数据量将使其正常工作。


引用的代码来自我创建的一个快速抽象的VS项目,以便隔离问题。 - Ersl
1
还有,减少数据量会如何解决这个问题?我的问题是超时异常没有被抛出。 - Ersl
抱歉,我以为你在谈论异常被抛出的问题。 - Oscar

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