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