我正在使用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();
}
}
}
答案 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));