【问题标题】:Cannot detect SQL error when using ExecuteNonQuery()使用 ExecuteNonQuery() 时无法检测到 SQL 错误
【发布时间】:2012-04-01 04:50:29
【问题描述】:

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

【问题讨论】:

  • 您可以在线程中运行代码并在该函数中调用 thread.abort
  • +1:我喜欢通过阅读就能学到东西的问题。

标签: c# sql executenonquery


【解决方案1】:

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

【讨论】:

  • 我不得不做类似的事情,但是对于外部线程必须访问 DB Command 对象的情况,所以我存储了最后一个使用的对象,因此阻塞 SQL 调用可能会被检查或取消另一个线程。
【解决方案2】:

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

【讨论】:

  • 感谢您的回答。我实际上并没有使用异常,我使用的是自定义异常,但只是为了示例代码,我将其更改为异常。您无权访问调用 ExcecuteNonQuery() 的代码中的 e.Errors。
猜你喜欢
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 2022-06-30
相关资源
最近更新 更多