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([color=Red]CommandBehavior.CloseConnection[/color]);
//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)
暂无评论。