【发布时间】:2015-05-08 10:04:11
【问题描述】:
我有一个可能会运行长时间运行的查询的 asp.net 应用程序。我希望用户能够取消 SQL Server 中的查询。我尝试使用 BeginExecuteReader 和 EndExecuteReader 使用带有等待句柄的异步操作,但这所做的只是在达到等待句柄的超时后取消线程。然而,查询仍在 SQL Server 中运行。我不能使用 KILL 命令,因为这需要 sysadmin 或 processadmin 角色,并且不允许应用的连接用户拥有这些提升的角色。
ASP.NET 如何按需取消查询?就像点击 SSMS 中的停止按钮,但使用网页中的按钮执行此操作。或者通知 SQL Server 尽快停止查询而不等待它完成? (使用 SQL Server 2012 和 .NET 4.5)
更新
我正在添加此说明。用户事先并不知道查询将花费很长时间。例如,他们错误地输入了一个巨大的日期范围,点击提交然后“哦哦!”。他们现在需要取消。
【问题讨论】:
-
您尝试过 SqlCommand.Cancel 吗? msdn.microsoft.com/en-us/library/… 。这必须从单独的线程中调用。
-
@Mez 一个线程如何获得另一个线程的SqlCommand 引用句柄?我假设取消必须发生在发出查询的同一个 sqlcommand 上?
-
根据文档:Cancel() = >" 尝试取消 SqlCommand 的执行",这意味着不能保证它实际上可以取消。我想 SQL Server 可以取消其中包含许多步骤的过程,并沿着一个步骤取消。但是对于已提交的查询:我看不到 SQL 服务器如何与之通信。
标签: c# asp.net .net sql-server