如何停止处理时间太长的查询

时间:2018-11-21 19:11:16

标签: c# asp.net sql-server

我有一个小程序,可以让学生测试在ASP.Net中构建并使用SQL Server数据库的SQL查询。问题是某些查询“挂起”了控制台和SQL Server。考虑到这一点,我想将执行时间限制为10s或引发异常。

现在代码看起来像这样:

        SqlCommand cmd = new SqlCommand();

        cmd.CommandText = TextBox1.Text; //Their query
        cmd.CommandType = CommandType.Text;
        cmd.CommandTimeout = 1;
        cmd.Connection = sqlConnection1;

        sqlConnection1.Open();
        try
        {
            GridView1.DataSource = cmd.ExecuteReader();
            GridView1.DataBind();
            int count = GridView1.Rows.Count;
            Label1.Text = count.ToString() + " Rows";
        }
        catch (Exception ex)
        {
            Label1.Text = ex.Message;
            GridView1.DataSource = null;
            GridView1.DataBind();
        }
        finally
        {
            sqlConnection1.Close();
        }

CommandtTimeout并不是为我做的,因为通常问题是查询一直在不断地流化行(主要是由于笛卡尔积运算)。

有没有一种方法可以在执行过程中停止查询而不循环遍历每一行?

2 个答案:

答案 0 :(得分:1)

您可以使用线程来检查timeout of the code

//Variables
string input;

//Code to run until time exceeds
Thread thread = new Thread(() => {
    input = Console.ReadLine();
});
thread.Start();

//Check if time exceeded
if (!thread.Join(TimeSpan.FromSeconds(10)))
{
    thread.Abort();
    throw new Exception("Time exceeded.");
}

答案 1 :(得分:0)

代替使用GridView1.DataSource = cmd.ExecuteReader();GridView1.DataBind();,您将不得不编写代码来继续读取DataReader,直到您确定它花费的时间太长或已经读取了太多的行