不错呦!smile@林凯西,确保“准备文件”中的几个文件都有安装,S...您好,看了您这篇帖子觉得很有帮助。但是有个问题想请...我的修改过了怎么还被恶意注册呢 @jjjjiiii 用PJ快9年了,主要是A...PJ3啊,貌似很少有人用PJ了,现在不是WP就是z...@332347365,我当时接入时错误码没有-10...楼主,ChkValue值应为-103是什么意思呢?...大哥 你最近能看到我发的信息,请跟我联系,我有个制...
CommandBehavior.CloseConnection使用示例
编辑:dnawo 日期:2011-11-24
复制内容到剪贴板
程序代码

public static SqlDataReader ExecuteReader(string sql)
{
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataReader idr = cmd.ExecuteReader();
//conn.Close();
return idr;
}
{
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;
}
{
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();
}
}
}
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
user2
True
Open
·带CommandBehavior.CloseConnection时测试结果:

user1
user2
True
Closed
user2
True
Closed
二、其他说明
实际使用中,我们可以用using来使用返回的SqlDataReader对象,这样就不需手动调用Close方法了:
复制内容到剪贴板
程序代码

using (SqlDataReader idr = ExecuteReader("Select [Id],[Name] FROM Table1TB"))
{
while (idr.Read())
{
Console.WriteLine(idr["Name"]);
}
}
{
while (idr.Read())
{
Console.WriteLine(idr["Name"]);
}
}






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