CommandBehavior.CloseConnection使用
其用在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方法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{//打开连接,执行查询//并且返回SqlDataReadercon.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{//打开连接,执行查询//并且返回SqlDataReadercon.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所示。
编写测试方法进行测试:
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对象关闭时自动关闭。
转载于:https://www.cnblogs.com/IT-Monkey/p/4112352.html
CommandBehavior.CloseConnection使用相关推荐
- CommandBehavior.CloseConnection有何作用
这是一个关于实际知识点的问题,面试官考查的是应聘者数据库访问的编程经验.本节将针对这个问题展开具体的分析.对于此类关于具体知识点的问题,读者在平时应该注意积累,这样在面试中才能从容应答. 所涉及的知识 ...
- CommandBehavior.CloseConnection的使用
分析问题 由于流模式读取数据库的特点,在具体应用时很难确定数据库连接何时才能被关闭,因为读取的动作是连续进行的,下面是一个常见的数据访问层的静态方法: ///<summary>/// 常见 ...
- 巧用枚举CommandBehavior关闭SqlDataReader联接数据库时的conn.open状态
编码过程中使用SqlDataReader 来操作数据库时,你是否每次在调用完你的数据库方法后,再手动调用方法或写代码关闭数据库联接呢?(呵呵 我以前是这样做的 见笑) 下面的方法可以完成解决此问题了, ...
- 一步一步写自己的SqlHelper类库
前言: 一开始不懂SqlHelper是什么,以为是新东西.第一遍大量的查资料,在csdn上找到很多人写好的SqlHelper类,发现每个人写的很像,但又都不一样,找了一个能用的上的,敲了一遍别人的代码 ...
- oracleHelper 操作帮助类
1 using System; 2 using System.Configuration; 3 using System.Data; 4 using System.Collections; 5 usi ...
- C# SQLiteHelper
1 public class SQLiteHelpers 2 { 3 /// <summary> 4 /// ConnectionString样例:Datasource=Test.db3; ...
- DateReader,DateAdapter,DateSet和SqlCommand的基本使用方法
1using System; 2using System.Data; 3using System.Data.SqlClient; 4 5namespace Demo3 6{ 7 /**/ ...
- Enterprise Library 4 数据访问应用程序块
Enterprise Library 数据访问应用程序块简化了实现常规数据访问功能的开发任务.应用程序可以在各种场景中使用此应用程序块,例如为显示而读取数据.传递数据穿过应用程序层( applicat ...
- 转载LINQ优点 自己学习用的
这几天在读一本LINQ方面的书<Essential LINQ>,在这里和大家分享下. 由于对LINQ的深入总结需要大量的篇幅,因此在这里分成几个部分来讲. (*我看<Essentia ...
- 使用ADO.NET 的最佳实践(zz)
数据访问:使用 ADO.NET 的最佳实践(ADO.NET 技术文档) 发布日期: 4/1/2004 | 更新日期: 4/1/2004 摘要:编写 Microsoft ADO.NET 代码的最佳实践, ...
最新文章
- android的xml置底_Android布局之xml设置
- 【流媒體】jrtplib—VS2010下RTP开源协议库JRTPLIB3.9.1编译
- eureka之InstanceInfo类
- MongoDB 分片的原理、搭建、应用
- 【MySQL】计算 TPS,QPS 的方式
- JSP语法(JSP动作)
- facebook 开源_Facebook开源主管开放
- Android 系统(87)---常见的内存泄漏原因及解决方法
- 八个常见CMD网络命令
- python3 获取电脑上某个点的颜色RGB值
- Python 实现大文件全文翻译
- Kubernetes 调整 nodePort 端口范围
- 排列组合思维导图_巧用思维导图做数学单元整理
- Flyway-数据库迁移工具
- Error syncing pod, skipping: failed to “StartContainer“ for “POD“ with ErrImagePull: “image pull fai
- df命令和du命令-个人
- 2015——致我那终将逝去的青春
- 谈谈对“竞态条件”和“数据竞争”的理解
- 邯郸“一趟清”业务改革,开创一窗受理新模式
- 好莱坞式的新美女与英雄
热门文章
- oracle错误代码及解决办法整合
- [转]Javascript 中 String.replace( ) 的妙用
- 跟着锅子一步步学习32位汇编(3)---MOV和XCHG指令
- (一)伤不起--java调用dll
- intellij 出现“Usage of API documented as @since 1.8+”的解决办法
- 这么多牛逼的Java常用Json库,万万没想到它的性能最好!
- 兄弟,答应我?别再去东南亚写代码了好么?
- pycharm pip安装_Python从入门到大师教程 | 一、搭建Python环境和安装Pycharm
- 对接支付宝遇到的坑sign check fail: check Sign and Data Fail
- a标签中执行js函数