【问题标题】:Cancel long-running Dapper Query取消长时间运行的 Dapper 查询
【发布时间】:2012-03-02 10:41:04
【问题描述】:

我们有一个使用 Dapper 进行数据库读取的 winforms 应用程序。

在一种形式中,我们在后台线程上有一个(可能的)长时间运行的查询。

用户希望能够取消查询,因此我需要访问 DbCommand Dapper 创建并在其上调用 Cancel(如果它正在运行,则从另一个线程)。

从 Dapper 公开此 DbCommand 的最佳方式是什么?

【问题讨论】:

  • 这目前没有公开,我想不出任何简单的方法来添加它,除了传入一个宣传事件的界面......我' m 假设这个特定的例子是例外而不是常态?或许只是这个手动编码?
  • 我以为我终于摆脱了手动数据阅读器的东西......你猜不是。但是,我仍然喜欢 Dapper。
  • 如果您对此有特别的想法,我会全力以赴......但是....我看不到任何 简单 方式 =
  • 好吧,我考虑引入一个 IQueryPipeline 接口可选参数,它公开了我的目的所需的事件
  • @MarcGravell 让我们通过显式转换访问它怎么样? ((WrappedReader)reader).Cancel() 或类似的。

标签: c# dapper


【解决方案1】:

现在是锤子时间。打破东西。

using (var reader = connection.ExecuteReader(query)) {

....现在取消

var wrappedReaderType = typeof (Dapper.CommandDefinition)
                        .Assembly.GetType("Dapper.WrappedReader");
var field = wrappedReaderType
            .GetField("cmd", BindingFlags.NonPublic | BindingFlags.Instance);
if (field != null)
{
    var command = field.GetValue(reader) as IDbCommand;
    if (command != null)
    {
        command.Cancel();
    }
}

【讨论】:

    猜你喜欢
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多