停止Linq查询是否需要“太长”

时间:2012-09-11 20:01:45

标签: c# asp.net .net linq linq-to-sql

目前,我需要创建一个报告程序,该程序在SQL数据库中的许多不同表上运行报告。多个不同的客户端需要此功能,但某些客户端拥有比其他客户端更大我想知道的是,如果查询一段时间过长,是否可以在一段时间后停止查询。

为了给出一些上下文,一些客户端具有超过200万行的表,尽管不同的客户端在同一个表中可能只有50k行。我希望能够运行20秒的查询,如果还没有完成,那么向用户返回一条消息,说结果集太大了,报告需要在小时之外生成不想在白天进行资源密集型操作。

2 个答案:

答案 0 :(得分:5)

通过CommandTimeoutproperty在您的连接字符串或DataContext上设置连接超时。超时到期后,您将获得TimeoutException,您的查询将被取消。

您无法确定在超时发生时服务器上是否取消了查询,但在大多数情况下,它会相当快地取消。有关详细信息,请阅读优秀文章"There's no such thing as a query timeout..."。其中重要的部分是:

  

客户端使用注意力向服务器发出查询超时信号   事件。注意事件只是一种不同类型的TDS包a   SQL Server客户端可以发送给它。除了连接/断开,   T-SQL批处理和RPC事件,客户端可以发出注意信号   服务器。注意告诉服务器取消连接   目前正在执行查询(如果有的话)。一个   注意不会回滚打开的交易,也不会停止   目前正在执行查询 - 服务器中止它   在下一个可用的机会做着连接。   通常,这种情况很快发生,但并非总是如此。

但请记住,它会因提供商而异,甚至可能会在服务器版本之间发生变化。

答案 1 :(得分:0)

如果在后台线程上运行查询,则可以轻松完成。使主线程启动计时器并生成运行查询的后台线程。如果20秒结束后,后台线程没有返回结果,主线程可以取消它。