CommandBehavior.CloseConnection有何作用

【原文地址:http://www.cnblogs.com/agian/articles/1648835.html

其用在ExecuteReader(c)中,返回对象前不能关闭数据库连接,须用CommandBehavior.CloseConnection;

这是一个关于实际知识点的问题,面试官考查的是应聘者数据库访问的编程经验。本节将针对这个问题展开具体的分析。对于此类关于具体知识点的问题,读者在平时应该注意积累,这样在面试中才能从容应答。

所涉及的知识点

CommandBehavior.CloseConnection的使用

分析问题

由于流模式读取数据库的特点,在具体应用时很难确定数据库连接何时才能被关闭,因为读取的动作是连续进行的,下面是一个常见的数据访问层的静态方法:
/// <summary>

/// 常见的获取SqlDataReader方法

/// 通常的数据访问层都会提供这个方法

/// </summary>

static SqlDataReader GetReader()

{

//通过连接字符串获取连接

SqlConnection con = new SqlConnection(conn_String);

try

{

//打开连接,执行查询

//并且返回SqlDataReader

con.Open();

SqlCommand cmd = con.CreateCommand();

cmd.CommandText = Sql;

SqlDataReader dr = cmd.ExecuteReader();

return dr;

}

finally

{

//这里的代码处于两难的境地

//如果这里执行关闭:con.Close();那返回的

SqlDataReader将毫无用处,因为其

//依赖的连接已经关闭

//如果这里不执行con.Close();那返回后该连接

将永远无法关闭,因为调用方无法

//得到连接对象

}

}

正如代码注释里描述的那样,这样的方法既不能关闭连接,也不能保持连接打开状态。很多系统为了解决这样两难的境地,只能放弃使用Reader模式的数据源,或者把连接对象交给方法调用者,以便进行关闭。

而CommandBehavior.CloseConnection的功能恰好就是为了避免类似的尴尬境地,它能够保证当SqlDataReader对象被关闭时,其依赖的连接也会被自动关闭。代码9-2展示了使用CommandBehavior.CloseConnection和不使用CommandBehavior.CloseConnection的区别。

这里以SqlDataReader为例进行说明,对于其他命名空间下的XXXDataReader对象,其功能是类似的。

首先为了展示功能,代码9-2包含了两个静态的返回SqlDataReader的方法,其中一个在执行ExecuteReader方法时传入了CommandBehavior.CloseConnection方法。

代码9-2 使用CommandBehavior.CloseConnection:UseCommandBehavior.cs
partial class UseCommandBehavior

{

//数据库看连接字符串

const String conn_String =

"Server=localhost;Integrated Security=true;database=NetTest";

const String Sql = "select * from dbo.DepartCost";

/// <summary>

/// 使用CommandBehavior.CloseConnection

/// </summary>

/// <param name="con">为了测试需要,传入连接对象</param>

static SqlDataReader GetReader_CloseConnection(SqlConnection con)

{

try

{

//打开连接,执行查询

//并且返回SqlDataReader

con.Open();

SqlCommand cmd = con.CreateCommand();

cmd.CommandText = Sql;

SqlDataReader dr = cmd.ExecuteReader

(CommandBehavior.CloseConnection);

return dr;

}

finally

{

//因为使用了CommandBehavior.CloseConnection,

//这里不需要关闭连接

//con.Close();

}

}

/// <summary>

/// 不使用CommandBehavior.CloseConnection

/// </summary>

/// <param name="con">为了测试需要,传入连接对象</param>

static SqlDataReader GetReader_NoCloseConnection(SqlConnection con)

{

try

{

//打开连接,执行查询

//并且返回SqlDataReader

con.Open();

SqlCommand cmd = con.CreateCommand();

cmd.CommandText = Sql;

SqlDataReader dr = cmd.ExecuteReader();

return dr;

}

finally

{

//为了使返回的SqlDataReader可用,这里不能关闭连接

//con.Close();

}

}

}

可以看到,无论是否使用CommandBehavior.CloseConnection,两个方法都没有在最终关闭连接,但是它们不关闭连接的原因并不相同。准备好了两个方法之后,就从主方法中分别调用这两个方法来进行测试,以查看从使用了CommandBehavior.CloseConnection的方法中返回的SqlDataReader对象是否在关闭的同时自动关闭连接,如代码9-3所示。

代码9-3 使用CommandBehavior.CloseConnection:UseCommandBehavior.cs
partial class UseCommandBehavior

{

/// <summary>

/// 测试方法

/// </summary>

static void Main(string[] args)

{

//建立连接

SqlConnection con = new SqlConnection(conn_String);

try

{

//测试使用了CommandBehavior.CloseConnection的方法

Console.WriteLine("测试使用了CommandBehavior.

CloseConnection的方法:");

SqlDataReader sdr = GetReader_CloseConnection(con);

while (sdr.Read()) { }

sdr.Close();

Console.WriteLine("读取完毕后的连接状态:" + con.State.ToString());

//测试没有使用CommandBehavior.CloseConnection的方法

Console.WriteLine("测试没有使用CommandBehavior.

CloseConnection的方法:");

SqlDataReader sdr1 = GetReader_NoCloseConnection(con);

while (sdr1.Read()) { }

sdr1.Close();

Console.WriteLine("读取完毕后的连接状态:" +

con.State.ToString());

Console.Read();

}

finally

{

//确保连接被关闭

if (con.State != ConnectionState.Closed)

con.Close();

}

}

}

下面是代码的执行结果:

测试使用了CommandBehavior.CloseConnection的方法:

读取完毕后的连接状态:Closed

测试没有使用CommandBehavior.CloseConnection的方法:

读取完毕后的连接状态:Open

正如读者所看到的,使用了CommandBehavior.CloseConnection得到的SqlDataReader对象,在关闭的同时会自动地关闭其依赖的数据库连接对象,这个特性解决了数据访问层编写中的困境。

答案

CommandBehavior.CloseConnection解决了流读取数据模式下,数据库连接不能有效关闭的情况。当某个XXXDataReader对象在生成时使用了CommandBehavior.CloseConnection,那数据库连接将在XXXDataReader对象关闭时自动关闭。

时间: 2024-08-08 01:27:08

CommandBehavior.CloseConnection有何作用的相关文章

C#使用SqlDataReader读取数据库数据时CommandBehavior.CloseConnection参数的作用

主要用在ExecuteReader(c)中,如果想要返回对象前不关闭数据库连接,须要用CommandBehavior.CloseConnection: CloseConnection解决了流读取数据模式下,数据库连接不能有效关闭的情况.当某个XXXDataReader对象在生成时使用了CommandBehavior.CloseConnection,那数据库连接将在XXXDataReader对象关闭时自动关闭. 由于流模式读取数据库的特点,在具体应用时很难确定数据库连接何时才能被关闭,因为读取的动

CommandBehavior.CloseConnection的使用

分析问题 由于流模式读取数据库的特点,在具体应用时很难确定数据库连接何时才能被关闭,因为读取的动作是连续进行的,下面是一个常见的数据访问层的静态方法:/// <summary>/// 常见的获取SqlDataReader方法 /// 通常的数据访问层都会提供这个方法 /// </summary> static SqlDataReader GetReader() { //通过连接字符串获取连接 SqlConnection con = new SqlConnection(conn_St

CommandBehavior.CloseConnection使用

其用在ExecuteReader(c)中,返回对象前不能关闭数据库连接,须用CommandBehavior.CloseConnection: 这是一个关于实际知识点的问题,面试官考查的是应聘者数据库访问的编程经验.本节将针对这个问题展开具体的分析.对于此类关于具体知识点的问题,读者在平时应该注意积累,这样在面试中才能从容应答. 所涉及的知识点 CommandBehavior.CloseConnection的使用 分析问题 由于流模式读取数据库的特点,在具体应用时很难确定数据库连接何时才能被关闭,

摘录-IT企业必读的200个.NET面试题-09 .NET中的数据库开发

ADO.NET和数据库的连接 Q: 请简要叙述数据库连接池的机制 数据库连接池就是一个存储数据库连接的缓冲池.ADO.NET对上层用户提供了数据库连接池的服务,使用完的数据库连接将被有选择地保持在数据库连接池中,以供下次使用.当用户以某个连接字符串申请数据库连接时,数据库连接池将尝试在池中寻找具有相同连接字符串的连接,并直接提供给用户. Q: 如何提高连接池内连接的重用率 为了提高数据库连接池的重用率,唯一的方法就是尽量保证系统访问数据库所使用的连接字符串不变.例如统一使用超级用户账户可以进一步

C# / MSSQL / WinForm / ASP.NET - SQLHelper中返回SqlDataReader数据

/// <summary> /// Execute a SqlCommand that returns a resultset against the database specified in the connection string /// using the provided parameters. /// </summary> /// <param name="connectionString">一个有效的数据库连接字符串</para

.NET基础 (20).NET中的数据库开发

ADO NET和数据库程序基础1 什么是关系型数据库2 如何通过SQL语句来实现行列转换3 ADO NET支持哪几种数据源 ADO NET和数据库的连接1 请简要叙述数据库连接池的机制2 如何提高连接池内连接的重用率3 一个连接字符串可以包含哪写属性4 CommandBehavior.CloseConnection有何作用 使用ADO NET读写数据库1 ADO NET支持哪两种方式来访问关系数据库2 什么是强类型的DataSet3 请解释SqlDataAdapter的基本工作机制4 如何自动生

【ASP.NET-中级】SQLHelper数据访问公共类

ASP.NET开发中的三层开发思想指的是UI层(界面显示层),BLL层(业务逻辑层),DAL层(数据访问层)三层,三层之间通过函数的调用来达到降低耦合,易于系统维护的目的,SQLHelper助手类的主要作用在于接收并执行来自各个数据表累传来的sql语句或存储过程.一般的SQLHelper类中主要包括以下几个函数功能: 1.执行不带参数的增删改方法 2.执行带参数的增删改方法. 3.执行不带参数的查询方法. 4.执行带参数的查询方法. 作为一个程序员SQLHelper类编写的好坏不仅影响着系统的可

Ajax与JSON使用教程

Ajax与JSON使用教程1.1.1 摘要 Ajax技术的核心是XMLHttpRequest对象(简称XHR),可以通过使用XHR对象获取到服务器的数据(入门教程qkxue.net),然后再通过DOM将数据插入到页面中呈现(腾云科技ty300.com).虽然名字中包含XML,但Ajax通讯与数据格式无关,所以我们的数据格式可以是XML或JSON等格式. XMLHttpRequest对象用于在后台与服务器交换数据,具体作用如下: 在不重新加载页面的情况下更新网页    在页面已加载后从服务器请求数

开发问题集锦

[1]重用项目窗体解决方案: 1. 把FmMain.cs 和 FmMain.Designer.cs 和 FmMain .resx 三个文件复制到程序目录下: 2. 在vs里面添加现有项, 选择FmMain.cs, 不用选择其它文件, 完成操作后重新打开窗口. [2]无法读写注册表解决方案 程序读写注册表是,通过代码将以下注册表路径下的Enabled值修改为0: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\FipsAlgorith