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

Eug*_*sev 10 .net c# database-connection

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

    public static IEnumerable<DbDataRecord> 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; }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*onH 8

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

也来自MSDN:

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

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

  • @eFloh - 没有优势,但取决于使用情况.很多时候,在一个例程中,您可以打开数据库连接,执行阅读器,使用阅读器数据,然后关闭连接以有效地关闭阅读器(不允许再按列名称对阅读器进行索引).如果您正在编程控制台应用程序或自上而下编程,这是可以的.但在大多数情况下,我们并没有采用自上而下的编程方法.在幕后我们有彼此交互的对象需要传递(返回)数据对象.使用commandbehavior.close我们确保一旦读者. (2认同)