异步函数未执行sqlCLR存储过程

本文关键字:sqlCLR 存储过程 执行 函数 异步 | 更新日期: 2023-09-27 17:58:24

我有一个CLR存储过程,我想从C#异步执行它。

代码如下:

private delegate void GeneratePayrollDelegate(string payProcessID);
public void GeneratePayroll(string payProcessID)
    {
        GeneratePayrollDelegate del = new GeneratePayrollDelegate(GeneratePayrollAsync);
        del.BeginInvoke(payProcessID, null, null);
    }
public void GeneratePayrollAsync(string payProcessID)
    {
        try
        {
            using (SqlConnection connection = new SqlConnection(DLConnectionStringHelper.GetConnectionString() + "; async=true;"))
            {
                using (SqlCommand cmd = new SqlCommand("proc_GeneratePayroll", connection))
                {                        
                    cmd.CommandTimeout = 3600;
                    cmd.CommandType = CommandType.StoredProcedure;
                    connection.Open();
                    cmd.ExecuteNonQuery();
                    connection.Close();
                }
            }
        }
        catch (Exception ex) { _Exceptions.ManageExceptions(ex); }
    }

如果此存储过程是从sql运行的,那么它将成功执行。

当它从上面的代码执行时,当试图通过作为参数发送的ID检索行时,它在CLR存储过程中不提供行。

需要帮助!

异步函数未执行sqlCLR存储过程

您正在调用cmd.ExecuteNonQuery();您应该调用BeginExecuteReader来获得结果,因为示例代码可以是这样的

private void Asynchronous(IAsyncResult asyncResult)
{
                System.Data.SqlClient.SqlDataReader reader;
                try
                {
                    System.Data.SqlClient.SqlCommand command =
                       asyncResult.AsyncState as System.Data.SqlClient.SqlCommand;
                    reader = command.EndExecuteReader(asyncResult);
                    while (reader.Read())
                    {
                    }
                    reader.Close();
                }
                catch
                {
                }
}
public void GeneratePayrollAsync(string payProcessID)
{
    try
    {
        using (SqlConnection connection = new SqlConnection("ConnectionString"))
        {
            using (SqlCommand command = new SqlCommand("proc_GeneratePayroll", connection))
            {
                command.CommandTimeout = 3600;
                command.CommandType = CommandType.StoredProcedure;
                //Set Your stored procedure parameter here
                connection.Open();
                command.BeginExecuteReader(Asynchronous, command, CommandBehavior.Default);
            }
        }
    }
    catch (Exception ex) {  }
}