首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#停止ExecuteQuery

C#停止ExecuteQuery
EN

Stack Overflow用户
提问于 2014-03-28 14:18:38
回答 3查看 964关注 0票数 1

我有一个运行.ExecuteQuery来返回一些结果的DataContext

我想在一段时间后完全停止查询,或者当用户停止查询时,但我不知道如何做到这一点。

我试着在这方面做了一些研究,但没有结果。

代码语言:javascript
复制
using(SomeDataContext db = new SomeDataContext)
{
    db.CommandTimeout = 10; // Test purposes

    List<Something> sme = new List<Something>;

    // I want to be able to cancel this
    sme = db.ExecuteQuery<Something>("Stored Procedure that may take some time").ToList();
}
EN

回答 3

Stack Overflow用户

发布于 2014-03-28 15:35:28

要做到这一点,最简单的方法是为EnityFramework废弃LinqToSQL中的所有东西(这是一项支离破碎且不受支持的技术)。然后,您可以只使用DbContext.Database.ExecuteSqlCommandAsync(String, CancellationToken, Object[]),您可以使用取消令牌来..well...cancel查询。请注意。LinqToSQL不支持取消。

但是,您也可以直接使用ADO.Net DbCommand来完成此操作。这很简单。

代码语言:javascript
复制
public Task RunCommand(CancelationToken cancel)
{

    using(var connection = new DbConnection())
    {
        connection.Open();
        using(var command = connection.CreateCommand())
        {
            //setup the command
            await command.ExecuteNonQueryAsync(cancel.Token);
        }

    }
}

public void Main()
{
    var cancel = new CancellationTokenSource();
    RunCommand(cancel.Token);
    cancel.Cancel();
}
票数 2
EN

Stack Overflow用户

发布于 2014-03-28 15:05:09

这是两个不同的问题:

  • 要在一段时间后停止查询的执行,您可以使用连接超时。根据你的数据库,你可能会有一个数据库查询的最大运行时间。
  • 让用户停止执行有点困难。您必须执行异步查询以将控制权返回给用户,但要维护对连接的引用,然后允许用户关闭连接。根据您的数据库,数据库应注册无人在等待回复,然后停止执行。
票数 1
EN

Stack Overflow用户

发布于 2014-03-28 14:31:04

我认为您可以通过应用逻辑来实现此功能。

逻辑:

当您启动ExecuteQuery时,在此之前使用 Transaction ,并在成功完成execution Commit事务之后。

同时,如果您想停止执行该过程。Rollback transactionClose the Connection

*DeadLock__.*风险:您必须确保并测试它能够很好地维护事务和连接,否则您的数据库就会进入

请参阅下面的示例代码和http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx

代码语言:javascript
复制
System.Data.Common.DbTransaction trans = null;

在类范围内声明。

代码语言:javascript
复制
//dbAdmin is my DataContext

dbAdmin.Connection.Open();
trans = dbAdmin.Connection.BeginTransaction();
dbAdmin.Transaction = trans;

 try
  {
   //Perform ExecuteQuery
    trans.Commit();
  }
 catch(Exception)
  {
   // Rollback transaction
   if (trans != null)
   trans.Rollback();
   return "Some error occured while saving record. Transaction has being rollbacked.";
  }

以及在停止执行事件中,

代码语言:javascript
复制
 if (trans != null)
   trans.Rollback();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22705573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档