6

我有以下运行 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

4

2 回答 2

3

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

于 2012-03-16T17:20:26.763 回答
1

使用SqlException类而不是Exception类。然后调查e.Errors

于 2012-03-16T16:11:05.880 回答