使用ExecuteNonQuery()时无法检测SQL错误

mil*_*lie 6 c# sql executenonquery

我有以下一些运行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
    }
}
Run Code Online (Sandbox Code Playgroud)

长时间运行的SQL语句可以通过使用具有适当严重性值的RAISERROR引发错误来报告SqlInfoMessageEventHandler的进度.

将FireInfoMessageEventOnUserErrors设置为true的原因是,如果没有这个,只有ExecuteNonQuery()返回时,才会立即处理来自SQL语句的所有消息.将此值设置为true,将在SQL语句引发进度消息时对其进行处理.

正如属性的名称所暗示的那样,事件处理程序还会触发错误,而不仅仅是针对SQL语句的进度反馈保留的特定严重性级别.

进度反馈的事件处理程序如下所示:

public void dbConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    if (e.Errors.Count > 0)
    {
        throw new Exception("Something bad happened");
    }

    // Report progress
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我可以检测到'e'中属性发生错误的时间,但抛出异常并没有做任何事情.我希望执行会落入catch块,但事实并非如此.

如何在ExcecuteNonQuery()方法之后确定发生错误?

TIA

mil*_*lie 3

我设法解决了。我已向包含事件处理程序的类添加了一个属性。如果出现错误,我会在该类中发送错误标志属性,然后可以在调用 ExcecuteNonQuery() 后读取该属性。如果出现错误,那么我可以执行清理代码。谢谢回复。