ExecuteReader(CommandBehavior.CloseConnection)会一直关闭连接吗?

编写这样的辅助方法是否安全? 它会一直关闭连接吗? 我想知道如果一切顺利,它会,但是即使它抛出,ExecuteReader也会关闭连接吗?

public static IEnumerable ExecuteSelect(string commandText, DbConnection conn) { using (DbCommand cmd = conn.CreateCommand()) { cmd.CommandText = commandText; conn.Open(); using (DbDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { foreach (DbDataRecord record in reader) { yield return record; } } } } 

是的,即使它抛出exception也会关闭连接。 如果未指定CommandBehavior.CloseConnection并关闭连接,则调用代码无法访问阅读器的内容。

也来自MSDN:

执行该命令时,关闭关联的DataReader对象时,将关闭关联的Connection对象。

完成后,应确保阅读器已关闭。 关于所有这一切的好处是你已经将它包装在一个using语句中并且你没有使用try/catch/finally在这种情况下读者将被关闭然后关闭数据库连接。

我个人更喜欢使用using子句关闭/处理连接,仅仅是出于并行构造的原因 – 与良好的英语语法相同。 对我来说使用CommandBehavior是不平衡的,因此是不可预测的。

我告诉我的开发人员要简单,一致。 如果他们忘记设置命令行为,我将不会看到它。 如果他们不使用 …我会看到它。

我知道这个问题与关闭连接有关; 但是,连接不会被处理掉。 要自行处理连接,您还需要将其包含在一个using块中:

 using (DBConnection conn = new ...) { using (DbCommand cmd = conn.CreateCommand()) { cmd.CommandText = commandText; conn.Open(); using (DbDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { foreach (DbDataRecord record in reader) { yield return record; } } } } 

更新我认为这是一个有趣的问题所以我写了以下测试:

 string connString = @"Data Source=.\SQLEXPRESS;Initial Catalog=msdb;Integrated Security=True;"; SqlConnection conn = new SqlConnection(connString); try { using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = "select from MSdbms"; conn.Open(); Console.WriteLine(conn.State); using (IDataReader reader = cmd.ExecuteReader())//Will throw an exception - Invalid SQL syntax -see setting CommandText above { Console.WriteLine("here"); } } } catch(Exception ex) { Console.WriteLine(conn.State); } //prints Open 

如果using (IDataReader reader = cmd.ExecuteReader())的行更改为: using (DbDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))则打印为Closed 。 要记住的事情。

是的它(在你正在做的使用区内)。 但是要访问您可能想要使用的数据而不是迭代其内容而使用DbDataReader.read。

如果您关闭阅读器和/或using(var reader ...){}阻止using(var reader ...){}阻止YES,请确保您的连接已关闭。

没有包装,也没有用reader关闭阅读器reader.Close()保持我的连接打开。