我使用以下方法对数据库执行查询并读取数据:
using(SqlConnection connection = new SqlConnection("Connection string"))
{
connection.Open();
using(SqlCommand command = new SqlCommand("SELECT * FROM TableName", connection))
{
using (SqlDataReader reader = command.ExecuteReader())
{
// read and process data somehow (possible source of exceptions)
} // <- reader hangs here if exception occurs
}
}
在读取和处理数据时,可能会发生一些异常。问题是DataReader
在Close()
调用中引发异常时挂起。您有什么想法吗???以及如何以适当的方式解决这个问题?当我写try..catch..finally
块而不是在放置阅读器之前using
调用时,问题消失了。command.Cancel()
finally
工作版本:
using(SqlConnection connection = new SqlConnection("Connection string"))
{
connection.Open();
using(SqlCommand command = new SqlCommand("SELECT * FROM TableName", connection))
{
SqlDataReader reader = command.ExecuteReader();
try
{
// read and process data somehow (possible source of exceptions)
}
catch(Exception ex)
{
// handle exception somehow
}
finally
{
command.Cancel(); // !!!
reader.Dispose();
}
}
}
发生异常时,您将在接收所有数据之前停止处理数据。如果您在几行后中止处理,则即使没有异常,也可以重现此问题。
放置命令或阅读器后,查询仍在服务器上运行。ADO.NET只会读取所有剩余的行和结果集(例如mad),然后将其丢弃。这样做是因为服务器正在发送它们,而协议要求接收它们。
调用SqlCommand.Cancel
将“注意”发送到SQL Server,导致查询真正终止。这与在SSMS中按“取消”按钮相同。
总结来说,尽管有更多行入站,但无论何时停止处理行,都会发生此问题。您的解决方法(称为SqlCommand.Cancel
)是正确的解决方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句