使用SqlDataAdapter填充DataTable时,CommandTimeout无法正常工作

时间:2015-02-27 11:39:35

标签: c# .net datatable timeout sqldataadapter

我将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);
}

2 个答案:

答案 0 :(得分:0)

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

What is the reason not to use select *?

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

答案 1 :(得分:0)

原因是SQLDataAdapter中出现的魔力,坦率地说,这是为什么它们是个坏主意。

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

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

如果无法做到这一点,请在连接字符串中设置连接超时,无论访问数据库的方式如何,都应该适用。