我有以下运行 SQL 语句的代码:
int rowsEffected = 0;
using (SqlConnection dbConnection = new SqlConnection(dbConnectionString))
{
try
{
dbConnection.InfoMessage += new SqlInfoMessageEventHandler(dbConnection_InfoMessage);
dbConnection.FireInfoMessageEventOnUserErrors = true;
dbConnection.Open();
SqlCommand command = dbConnection.CreateCommand();
command.CommandTimeout = 0;
command.CommandText = sqlStatement;
rowsEffected = command.ExecuteNonQuery();
}
catch (Exception e)
{
// Handle exception
}
}
长时间运行的 SQL 语句可以通过 SqlInfoMessageEventHandler 报告进度,方法是使用具有适当严重性值的 RAISERROR 引发错误。
将 FireInfoMessageEventOnUserErrors 设置为 true 的原因是,如果没有这个,来自 SQL 语句的所有消息只会在 ExecuteNonQuery() 返回时一次性处理。将此值设置为 true 时,进度消息将在 SQL 语句引发时进行处理。
正如该属性的名称所暗示的那样,事件处理程序也会在错误时触发,而不仅仅是在为 SQL 语句的进度反馈保留的特定严重级别上触发。
进度反馈的事件处理程序如下所示:
public void dbConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
if (e.Errors.Count > 0)
{
throw new Exception("Something bad happened");
}
// Report progress
}
如您所见,我可以检测到 'e' 中的属性何时发生错误,但抛出异常没有任何作用。我希望执行会落入 catch 块,但事实并非如此。
如何在 ExcecuteNonQuery() 方法之后确定发生错误?
TIA