存储过程调用随机工作

时间:2015-12-04 15:36:06

标签: c# sql-server stored-procedures

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

存储过程已经从SQL Server Management Studio进行了测试和执行,它们总是运行良好,所以我的问题在于调用它们。

奇怪的是它随机工作。有时它工作正常,但大多数时间,服务不执行程序。我调试了它,BeginExecuteNonQuery()的结果总是“Ran To Completion”,所以它表示运行正常。

我包含了进行调用的方法的代码。我没有包含存储过程代码,因为它们很大,正如我所说,当你从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();
        }
    }
}

1 个答案:

答案 0 :(得分:2)

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

完成操作

MSDN

  

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

MSDN获取的如何使用它的示例:

SqlCommand command = new SqlCommand(commandText, connection);
connection.Open();

IAsyncResult result = command.BeginExecuteNonQuery();
while (!result.IsCompleted)
{
    Console.WriteLine("Waiting ({0})", count++);
    // Wait for 1/10 second, so the counter
    // does not consume all available resources 
    // on the main thread.
    System.Threading.Thread.Sleep(100);
}
Console.WriteLine("Command complete. Affected {0} rows.", 
                    command.EndExecuteNonQuery(result));