CommandBehavior.CloseConnection使用示例

public static SqlDataReader ExecuteReader(string sql)
{
    conn.Open();
    SqlCommand cmd = new SqlCommand(sql, conn);
    SqlDataReader idr = cmd.ExecuteReader();
    //conn.Close();
    return idr;
}

在上边代码中,因为其他程序要使用ExecuteReader方法返回的SqlDataReader对象,所以我们不能调用Close方法关闭conn,否则程序会出错:

引用内容 引用内容
阅读器关闭时尝试调用 Read 无效。

但这样会带来新的问题,因为conn没有关闭,结果会导致创建的数据库连接没有及时关闭,最终使连接池达到最大值!或许微软正是考虑了这个问题,所以创建了枚举CommandBehavior,它允许在后续的代码中关闭SqlDataReader对象时,也一起关闭其关联的SqlConnection对象,使用方法如下:

public static SqlDataReader ExecuteReader(string sql)
{
    conn.Open();
    SqlCommand cmd = new SqlCommand(sql, conn);
    SqlDataReader idr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    //conn.Close();
    return idr;
}

一、CommandBehavior.CloseConnection使用示例

using System;
using System.Data;
using System.Data.SqlClient;

namespace ConsoleApplication1
{
    class Program
    {
        /// <summary>
        /// 数据库连接串
        /// </summary>
        static SqlConnection conn = new SqlConnection("server=.;database=zyq;user id=sa;password=sa;min pool size=4;max pool size=100;Connection Lifetime=30;Enlist=true;");

        /// <summary>
        /// 数据查询
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public static SqlDataReader ExecuteReader(string sql)
        {
            conn.Open();
            SqlCommand cmd = new SqlCommand(sql, conn);
            SqlDataReader idr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            //conn.Close();
            return idr;
        }

        static void Main(string[] args)
        {
            SqlDataReader idr = ExecuteReader("Select [Id],[Name] FROM Table1TB");
            while (idr.Read())
            {
                Console.WriteLine(idr["Name"]);
            }
            idr.Close();//重要

            Console.WriteLine(idr.IsClosed);
            Console.WriteLine(conn.State.ToString());

            Console.ReadKey();
        }
    }
}

·不带CommandBehavior.CloseConnection时测试结果:
引用内容 引用内容
user1
user2
True
Open

·带CommandBehavior.CloseConnection时测试结果:
引用内容 引用内容
user1
user2
True
Closed

二、其他说明

实际使用中,我们可以用using来使用返回的SqlDataReader对象,这样就不需手动调用Close方法了:
using (SqlDataReader idr = ExecuteReader("Select [Id],[Name] FROM Table1TB"))
{
    while (idr.Read())
    {
        Console.WriteLine(idr["Name"]);                    
    }
}


评论: 0 | 引用: 0 | 查看次数: 5996
发表评论
登录后再发表评论!