随机工作的存储过程调用

本文关键字:调用 存储过程 工作 随机 | 更新日期: 2023-09-27 18:25:37

我正在从用C#开发的Windows服务中调用两个存储过程。它应该在DB上的一个确定的表中写入两条记录。

存储过程已经在SQLServerManagementStudio中进行了测试和执行,它们总是运行良好,所以我的问题是调用它们。

奇怪的是它是随机工作的。有时它工作得很好,但大多数时候,服务不会执行过程。我调试过它,BeginExecuteNonQuery()的结果总是"运行到完成",所以它说运行正常。

我将包括进行调用的方法的代码。我不包括存储过程代码,因为它们是巨大的,正如我所说,当您从Management Studio中执行它并将NULL作为参数时,它们总是可以正常工作。当然,我没有任何连接或存储过程命名问题。

public void Process()
{
    if (!_initialized)
        Initialize();
    Stopped = false;
    try
    {
        // Calling Sales sp
        DoOutboundProcedure("procedure1", null, null, null);
        // Calling Returns sp
        DoOutboundProcedure("procedure2", null, null, null);
    }
    catch (Exception ex)
    {
        _logger.Error(ex.Message);
    }
}
public void DoOutboundProcedure(string procedureName, object i_TraceOn, object i_Validate, DateTime? i_NextDateLastModified)
{
    using (SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DatabaseConnection"].ConnectionString))
    {
        using (SqlCommand cmd = new SqlCommand(procedureName, con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@i_TraceOn", SqlDbType.TinyInt).Value = i_TraceOn;
            cmd.Parameters.Add("@i_Validate", SqlDbType.Bit).Value = i_Validate;
            cmd.Parameters.Add("@i_NextDateLastModified", SqlDbType.DateTime).Value = i_NextDateLastModified;
            con.Open();
            _logger.Trace("Calling store procedure '"{0}'".", procedureName);
            var result = cmd.BeginExecuteNonQuery();
            _logger.Trace("Stored procedure calling finished.");
            con.Close();
        }
    }
}

随机工作的存储过程调用

由于您尝试与BeginExecuteNonQuery()异步执行此操作,因此必须使用EndExecuteNonQuery() 完成此操作

根据MSDN:

调用BeginExecuteNonQuery执行Transact-SQL语句时,必须调用EndExecuteNonQuery才能完成操作。如果执行命令的过程尚未完成,则此方法将阻塞,直到操作完成。用户可以使用BeginExecuteNonQuery方法返回的IAsyncResult实例来验证该命令是否已完成操作。如果在对BeginExecuteNonQuery的调用中指定了回调过程,则必须调用此方法。

如何使用它的示例,摘自MSDN:

SqlCommand命令=新的SqlCommand(commandText,connection);联系Open();IAsyncResult result=命令。BeginExecuteNonQuery();while(!result.IsCompleted){Console.WriteLine("正在等待({0})",计数++);//等待1/10秒,因此计数器//不消耗所有可用资源//在主线程上。System.Threading.Thread.Sleep(100);}Console.WriteLine("命令完成。受影响的{0}行。",命令EndExecuteNonQuery(结果));