我有一个小程序,可以让学生测试在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
并不是为我做的,因为通常问题是查询一直在不断地流化行(主要是由于笛卡尔积运算)。
有没有一种方法可以在执行过程中停止查询而不循环遍历每一行?
答案 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,直到您确定它花费的时间太长或已经读取了太多的行