Sqlexception 从catch块调用ExecuteReader()

Sqlexception 从catch块调用ExecuteReader(),sqlexception,Sqlexception,我有以下代码,当异常发生时,Catch块中的ExecuteReader()将挂起应用程序 我的问题是为什么要绞刑?如果查询异常通常发生,我不能在Catch块内执行查询 Try { // some SQL queries } catch (SqlException odbcEx) { // do some queries with IDbCommand::ExecuteReader() } catch (Exception ex) { // Handle generic ones

我有以下代码,当异常发生时,Catch块中的ExecuteReader()将挂起应用程序

我的问题是为什么要绞刑?如果查询异常通常发生,我不能在Catch块内执行查询

Try {
   // some SQL queries
}
catch (SqlException odbcEx) {
   // do some queries with IDbCommand::ExecuteReader()
}
catch (Exception ex) {
   // Handle generic ones here.
}
谢谢,

ExecuteReader()保持您的SQL连接。您要做的是在它周围包装一个using语句。此外,您不能执行SQL查询,因为您的SQL连接变量的作用域基本上已出错。如果需要,可以通过实例化
读取器
连接
的新实例,在异常块中执行一些进一步的SQL操作,但理想情况是在执行此操作之前关闭现有连接。如果使用
数据表
,则无法保持SQL连接。也许可以看看

例如:

using (var conn = new SqlConnection("ConnectionString"))
{
try {
   // some SQL queries
}
catch (SqlException odbcEx) {
   // do some queries with IDbCommand::ExecuteReader()
}
catch (Exception ex) {
   // Handle generic ones here.
}
finally {
  conn.Close();
}
}

通过这种方式,您正在处理连接,而不是保留连接。

因此,这里发生的情况是ExecuteReader()尝试根据损坏的连接执行查询?不确定损坏是正确的术语。可能处于不可用状态/崩溃。当它这样做时,它会使SQL连接保持打开状态,并且使用DataReader,您可以在任何给定时间打开单个连接,因此,除非您关闭读卡器及其关联的连接,否则您不能使用相同的DataReader。您可能需要查找SqlDataAdapter和DataTable。