我想让用户能够取消正在运行的查询.查询真的很慢.(查询优化除此之外.)这主要是出于好奇心.
MSDN说:
如果没有什么可以取消,则不会发生任何事情 但是,如果正在处理命令,并且尝试取消失败,则不会生成异常.
这就是我所拥有的:
var t = new Thread(AbortThread);
t.Start();
void AbortThread()
{
LongQuery.Current.Cmd.Cancel();
LongQuery.Current.Cmd.Dispose();
LongQuery.Current.DA.Dispose();
LongQuery.Current.Conn.Close();
LongQuery.Current.Conn.Dispose();
LongQuery.Current.Cmd = null;
LongQuery.Current.DA = null;
LongQuery.Current.Conn = null;
CurrentSearch.Abort();
CurrentSearch.Join();
CurrentSearch = null;
}
Run Code Online (Sandbox Code Playgroud)
我注意到这CurrentSearch.Abort()是阻塞,这就是为什么我把它包装在一个线程中,这可能意味着线程仍在工作.
最后,除了这个我可以做什么来取消查询?实际上是否可以从.NET取消这么长的查询?
如果你真的想要杀死它,这个方法很好用:
SELECT @@SPID AS 'SESSIONID'同一连接,在开始长时间运行的查询之前存储会话ID当你想要杀死它时:
KILL该会话ID ALTER ANY CONNECTION执行此操作的权限