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对象关闭时自动关闭。

CommandBehavior.CloseConnection的使用的更多相关文章

  1. CommandBehavior.CloseConnection

    cmd.commandTimeout设置为了1秒,sql执行了很长时间还没有超时, cmd.ExecuteReader(CommandBehavior.CloseConnection)这样就会立马重现 ...

  2. cmd.ExecuteReader(CommandBehavior.CloseConnection)

    有些开发人员坚持认为,如果您设置 CommandBehavior.CloseConnection 选项,则 DataReader 及其相关联的连接会在 DataReader 完成数据读取时自动关闭.这 ...

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

    主要用在ExecuteReader(c)中,如果想要返回对象前不关闭数据库连接,须要用CommandBehavior.CloseConnection: CloseConnection解决了流读取数据模 ...

  4. CommandBehavior.CloseConnection有何作用

    其用在ExecuteReader(c)中,返回对象前不能关闭数据库连接,须用CommandBehavior.CloseConnection: 这是一个关于实际知识点的问题,面试官考查的是应聘者数据库访 ...

  5. CommandBehavior.CloseConnection使用

    其用在ExecuteReader(c)中,返回对象前不能关闭数据库连接,须用CommandBehavior.CloseConnection: 这是一个关于实际知识点的问题,面试官考查的是应聘者数据库访 ...

  6. 浅谈CommandBehavior枚举的独特之处

    提供对查询结果和查询对数据库的影响 此枚举有一个 FlagsAttribute 属性,通过该属性可使其成员值按位组合. 命名空间:  System.Data程序集:  System.Data(在 Sy ...

  7. Microsoft Visual Studio 2017 for Mac Preview 下载+安装+案例Demo

    目录: 0. 前言 1. 在线安装器 2. 安装VS 3. HelloWorld 4. ASP.NET MVC 5. 软件下载 6. 结尾 0. 前言: 工作原因,上下班背着我的雷神,一个月瘦了10斤 ...

  8. 完美解决CodeSmith无法获取MySQL表及列Description说明注释的方案

    问题描述: CodeSmith是现在比较实用的代码生成器,但是我们发现一个问题: 使用CodeSmith编写MySQL模板的时候,会发现一个问题:MySQL数据表中的列说明获取不到,也就是column ...

  9. .NET基础拾遗(6)ADO.NET与数据库开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...

随机推荐

  1. MyBatis里字段到枚举类型的转换/映射

    一.简介 我们在用MyBatis里,很多时间有这样一个需求:bean里有个属性是枚举,在DB存储时我们想存的枚举的代号,从DB拿出来时想直接映射成目标枚举类型,也即代号字段与Java枚举类的相互类型转 ...

  2. HDOJ(HDU) 1465 不容易系列之一(错排)

    Problem Description 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了! 做好"一件"事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就 ...

  3. POJ 1979 深度优先搜索

    题意:有红色和黑色的格子,只能走黑色的,问从起始位置出发,最多能走到达多少块黑色格子. 分析:相当于走迷宫,黑色格子是路,红色格子是墙,每次到达一个未到达过的格子时计数,原点也算是一个.每次可以走上下 ...

  4. linux下常用FTP命令

    linux下常用FTP命令 1. 连接ftp服务器 1. 连接ftp服务器格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1b)服 ...

  5. JavaScript兼容问题汇总[实时更新]

    印象笔记链接地址:点我查看   遇到问题不断更新中--    [转载请注明出处-HTML5自由者] 

  6. openwrt上网配置的一些理解(二)

    上一篇里面遇到了只能静态上网的问题,动态不行.所以再接再励,问题总是要解决的,偷懒的下场就是一直停留在菜鸟的水平. 首先分析下问题,要动态上网,首先我要明确不是动态获取不了IP,是获取了,上不了外网. ...

  7. C程序设计的抽象思维-算法分析-大多数元素

    [问题] 请编写下面函数 int MajorityElement(int array[],int n); 该函数返回数组array中的多数元素.多数元素是指在占绝对多数(至少51%)的一个值.假设多数 ...

  8. (一)MVP设计模式

    一.MVP介绍      随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时 ...

  9. response和request

    请求响应流程图 response response是用来向客户端响应的对象! 需要回忆一下http响应内容: l  首行:状态码 l  响应头: 1头1值,1头多值: l  响应体(正文):html ...

  10. JavaScript的68个技巧一

    1. 严格模式 在自己的项目中 你可以坚持只使用" 严格模式 " 或只使用" 非严格模式 "的策略.但如果你要编写健壮的代码应对各种各样的代码连接 你有两个可选 ...