【问题标题】:How to stop a SQL Server query from an ASP.NET app without using KILL?如何在不使用 KILL 的情况下停止来自 ASP.NET 应用程序的 SQL Server 查询?
【发布时间】: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


【解决方案1】:

这是拥有大量数据表的大型企业的常见问题。你能在你的 SQL 中添加行限制吗?

SET ROWCOUNT 4000;

然后,您可以在应用中检查结果,如果返回的行数达到限制,您可以向用户发送消息。

另一个解决方案是在运行完整查询之前发出 count() 命令并确定行数和字节数,并在运行完整查询之前确定它是否太多。

取消查询会在 SQL Server 上调用回滚。这不是可以阻止的事情。因此,除了取消 ado.net 中的连接或命令之外,这不是理想的解决方案。

【讨论】:

    猜你喜欢
    • 2017-03-09
    • 2017-05-03
    • 1970-01-01
    • 2023-03-29
    • 2021-09-18
    • 2013-03-11
    • 2023-04-10
    相关资源
    最近更新 更多