【问题标题】:Long Running Stored Procedure from ADO.NET or Classic ADO来自 ADO.NET 或经典 ADO 的长时间运行的存储过程
【发布时间】:2009-01-19 17:03:31
【问题描述】:

假设存储过程需要 10 分钟才能运行并且没有返回数据。

在 SQL Server 中调用存储过程并让您的代码不等待结果的正确方法是什么?有没有办法从 T-SQL 或连接处理它?适用于 ADO.NET 和经典 ActiveX ADO 的东西?

我想到的唯一方法是:
1) 在您的 T-SQL 中创建作业
2) 将基于 T-SQL 的代码加载到作业的第一步
3) 确保代码的最后一行删除了 Job
4)执行作业(我很确定这不会让你等待回复) 我知道这是非常糟糕和骇人听闻的......但是

是否还有其他一些我没有想到的 T-SQL,您可以将存储过程包装在其中以说“我知道没有响应......所以我选择不等待。”?

【问题讨论】:

    标签: .net sql-server tsql ado.net ado


    【解决方案1】:

    是的,你可以

    1. 异步调用它,使用 SqlCommand.BeginExecuteNonQuery()
    2. 或者在一个 委托(将使用来自的线程 线程池),
    3. 或在单独的线程上(创建 自己)
    4. 在经典 ADO 中,使用选项 Connection 的 Open 中的参数 方法:

      oConnection.Open( , , , adAsyncConnect)

    【讨论】:

      【解决方案2】:

      对于 .Net,请尝试您的 SqlCommand 对象的 .BeginExecuteNonQuery() 方法。不过,不确定 ActiveX ADO 会如何工作。

      【讨论】:

        【解决方案3】:

        我会调查重写任何花费这么长时间的 SP,除非它正在进行更改或插入大量记录。如果您的 sp 从用户界面花费超过 30 秒,我说您很有可能出现性能问题。有问题的 proc 是否有游标?如果你是这样的话,你可以通过适当的性能调整将它降低到毫秒。在执行解决方法以使用户界面在没有 proc 完成的情况下继续运行之前,我会考虑性能调整。

        您说它不返回任何记录,但如果失败,用户需要知道什么?如果他们继续做其他事情,他们会认为它已经成功完成。

        【讨论】:

        • 我希望一定数量的“管理员”角色的用户能够触发这个过程。它不是真正的标准 UI 过程。
        【解决方案4】:

        在单独的线程中运行它,然后让线程死掉。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多