随机工作的存储过程调用
本文关键字:调用 存储过程 工作 随机 | 更新日期: 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(结果));