SqlCommand.BeginExecutenQuery或SQL作业的备选方案?(用于从asp.net网页异步调用存储过程)

SqlCommand.BeginExecutenQuery或SQL作业的备选方案?(用于从asp.net网页异步调用存储过程),asp.net,sql-server-2008,sqlcommand,sql-job,Asp.net,Sql Server 2008,Sqlcommand,Sql Job,目标:通过单个函数调用,从asp.net网页的代码隐藏中异步调用带有参数的非常慢的存储过程,然后忘记它 注意:我尝试使用SqlCommand.beginexecutenquery,但没有调用SqlCommand.endexecutenquery。请参阅下面的代码,但存储过程没有运行。我使用一个微小的存储过程来更新表中的单个字段以进行测试,但该字段没有更新。当我使用SqlCommand.ExecuteOnQuery时,它会得到更新 我对存储过程不感兴趣,也不知道存储过程何时结束。所以我迫不及待地等

目标:通过单个函数调用,从asp.net网页的代码隐藏中异步调用带有参数的非常慢的存储过程,然后忘记它

注意:我尝试使用SqlCommand.beginexecutenquery,但没有调用SqlCommand.endexecutenquery。请参阅下面的代码,但存储过程没有运行。我使用一个微小的存储过程来更新表中的单个字段以进行测试,但该字段没有更新。当我使用SqlCommand.ExecuteOnQuery时,它会得到更新

我对存储过程不感兴趣,也不知道存储过程何时结束。所以我迫不及待地等待它调用SqlCommand.endexecutenquery

情况: 经过一些研究,我发现sql作业可以用于此目的。对于sp参数;我可以将它们存储在表中,然后sp可以读取它们。然而,我不知道这是否是解决我的问题的正确方法,我对SQL世界是新手。我希望您可以就此对sql作业的使用进行评论,或者提出其他建议。谢谢

代码:


我认为您应该在单独的线程中执行sp


例如,使用ThreadPool在单独的线程上进行同步调用

它看起来像这样

提取方法:

更改您的代码:

它将对线程池中的某个线程进行同步调用,一旦完成,它将关闭连接,您就完成了。
就性能而言,这不是最好的解决方案,因为当线程等待存储的进程时,它将有一个线程处于休眠状态,但它已经足够好了,可以执行您想要的操作。

我正在从asp.net的代码隐藏中寻找一种方法,但意识到没有简单的方法可以做到这一点,我不想考虑连接或超时问题。我最终通过一个网络服务完成了这项工作

从asp.net代码中,我同步调用Web服务的函数。 在web服务的函数中,我使用异步调用存储过程。 回调在web服务中处理,以进行错误处理。
因此,我的网页一直按我希望的方式工作:启动一次请求,然后忘记它。

这会因为ASP页面超时而受到影响吗?另外,如果客户端断开连接(例如网络连接断开),存储过程是否会一直运行直到完成其工作?老实说,我不是100%确定。我最好的猜测是,一旦它被触发,它将继续处理。不过,很容易测试。对于SqlCommand.ExecuteNonQuery,如果客户端断开连接(例如网络连接断开),存储过程会一直运行直到完成其工作吗?不,我必须使用asp.net 3.5。您能解释更多吗?这是我今天遇到的问题,我想执行一个特定的存储过程,然后忘记它,你能给我看一些示例代码吗?
    using (SqlConnection connection = new SqlConnection(
        @"Data Source=XXX\MSSQL2008R2;Initial Catalog=YYY;Integrated Security=True"
        + ";Asynchronous Processing=true"))
    {
        connection.Open();
        SqlCommand cmd = new SqlCommand("spTestProcedure", connection);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new SqlParameter("@pText", DateTime.Now.ToString()));
        cmd.BeginExecuteNonQuery(); //Doesn't work.
        //cmd.ExecuteNonQuery(); // This works.
    }
private void ExecuteCommandSync()
{
    using (SqlConnection connection = new SqlConnection( 
        @"Data Source=XXX\MSSQL2008R2;Initial Catalog=YYY;Integrated Security=True" 
        + ";Asynchronous Processing=true")) 
    { 
        connection.Open(); 
        SqlCommand cmd = new SqlCommand("spTestProcedure", connection); 
        cmd.CommandType = CommandType.StoredProcedure; 
        cmd.Parameters.Add(new SqlParameter("@pText", DateTime.Now.ToString())); 
        cmd.ExecuteNonQuery(); 
    }
}
ThreadPool.QueueUserWorkItem((x) => { ExecuteCommandSync(); });