gpt4 book ai didi

c# - 使用 ExecuteNonQuery() 时无法检测到 SQL 错误

转载 作者:太空狗 更新时间:2023-10-29 21:46:19 41 4
gpt4 key购买 nike

我有以下运行 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 block ,但事实并非如此。

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

TIA

最佳答案

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

关于c# - 使用 ExecuteNonQuery() 时无法检测到 SQL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9723808/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com