本文解释使用SqlDataReader关闭数据库连接的问题:

例如把数据库的操作都封装到了一个类中,但SqlDataReader只有在读取完毕时才能关闭数据库,这样类中就不能关闭书库库连接。在函数中关闭,如果在函数中就关闭了会提示‘阅读器关闭时Read的尝试无效’ .

这点微软当然想到了。用着个方法dr   =   Cmd.ExecuteReader(CommandBehavior.CloseConnection);,MSDN中对 CommandBehavior.CloseConnection的解释是‘在执行该命令时,如果关闭关联的   DataReader   对象,则关联的   Connection   对象也将关闭。’

但。。。。。,请看下面的问题:

在函数中执行操作然后返回DataReader,然后在外面读出数据,读取完毕后在外部关闭DataReader,这样函数中的Connetion会自动关闭吗?

实例展示:

我把所有对数据库的操作都封装到了一个类中,写程序时就直接调用这个类的某个函数来返回结果!(我们学习网-weareleran.net)


  下面是一个用来返回DataReader对象的通用类,     

  public     SqlDataReader     GetReader(string     SQL)       

  {     

  SqlConnection     Conn;     

  Conn     =     new     SqlConnection(strConn);     

  Conn.Open();     

  SqlCommand     Cmd     ;     

  Cmd     =     CreateCmd(SQL,     Conn);     

  SqlDataReader     dr;     

  try     

  {     

  dr     =     Cmd.ExecuteReader(CommandBehavior.CloseConnection);     

  }     

  catch     

  {     

  throw     new     Exception(SQL);     

  }     

  Cmd.Dispose();     

  return     dr;     

  }

在程序在需要的时候我就直接构造好SQL语句,调用这个函数即可,如下:

string     sql="select     *     form     student";     

        SqlDataReader     dr     =     mydate.GetReader(sql);//调用数据库操作通用类中的GetReader函数,返回SqlDataReader     

            if(dr.Read())     

              {     

              .........读出数据,赋值给页面控件.....     

              }     

  dr.Close();//操作完毕,关闭DataReader

我按照这样的写基本已经没问题了,可以正常读取出数据,但是我现在担心的一个问题是Connection对象的关闭问题,因为是在函数中建立的 Connection对象,没办法在外部来关闭它,又不能在函数中关闭,如果在函数中就关闭了会提示‘阅读器关闭时Read的尝试无效’  
   
但我在函数中就用了这一行:dr   =   Cmd.ExecuteReader(CommandBehavior.CloseConnection);,MSDN中对 CommandBehavior.CloseConnection的解释是‘在执行该命令时,如果关闭关联的   DataReader   对象,则关联的   Connection   对象也将关闭。’  
   
也就是说我在关闭了DataReader之后,关联的Connection会自动关闭,我也测试过,测试代码如下:

string     strConn     =     ConfigurationSettings.AppSettings["SqlDatabase"];     

  SqlConnection     cn=new     SqlConnection(strConn);     

  cn.Open();     

                      string     sql="select     *     form     student";     

  SqlCommand     cm=new     SqlCommand(sql,cn);     

  SqlDataReader     dr=cm.ExecuteReader(CommandBehavior.CloseConnection);     

  SqlDataReader     dr     =     mydate.RunProcGetReader(sql);     

                              if(dr.Read())     

  {     

                                      .......读取数据     

                                        }     

      dr.Close();//关闭DataReader     

                      Response.Write(cn.State);//输出Connetion的状态

结果运行这一段,输出:Closed   ,可见Connetion确实自动关闭了!但是如我在上面所说,我的Coonection是在函数在建立的,在函数中执行操作然后返回 DataReader,然后在外面读出数据,读取完毕后在外部关闭DataReader,这样函数中的Connetion会自动关闭吗

我把所有对数据库的操作都封装到了一个类中,写程序时就直接调用这个类的某个函数来返回结果!  
   
下面是一个用来返回DataReader对象的通用类,

public     SqlDataReader     GetReader(string     SQL)       

  {     

  SqlConnection     Conn;     

  Conn     =     new     SqlConnection(strConn);     

  Conn.Open();     

  SqlCommand     Cmd     ;     

  Cmd     =     CreateCmd(SQL,     Conn);     

  SqlDataReader     dr;     

  try     

  {     

  dr     =     Cmd.ExecuteReader(CommandBehavior.CloseConnection);     

  }     

  catch     

  {     

  throw     new     Exception(SQL);     

  }     

  Cmd.Dispose();     

  return     dr;     

  }

在程序在需要的时候我就直接构造好SQL语句,调用这个函数即可,如下:  
   
string   sql="select   *   form   student";  
   
      SqlDataReader   dr   =   mydate.GetReader(sql);//调用数据库操作通用类中的GetReader函数,返回SqlDataReader  
   
          if(dr.Read())  
            {  
            .........读出数据,赋值给页面控件.....  
            }  
dr.Close();//操作完毕,关闭DataReader  
   
   
   
我按照这样的写基本已经没问题了,可以正常读取出数据,但是我现在担心的一个问题是Connection对象的关闭问题,因为是在函数中建立的 Connection对象,没办法在外部来关闭它,又不能在函数中关闭,如果在函数中就关闭了会提示‘阅读器关闭时Read的尝试无效’  
   
但我在函数中就用了这一行:dr   =   Cmd.ExecuteReader(CommandBehavior.CloseConnection);,MSDN中对 CommandBehavior.CloseConnection的解释是‘在执行该命令时,如果关闭关联的   DataReader   对象,则关联的   Connection   对象也将关闭。’  
   
也就是说我在关闭了DataReader之后,关联的Connection会自动关闭,我也测试过,测试代码如下:

string     strConn     =     ConfigurationSettings.AppSettings["SqlDatabase"];     

  SqlConnection     cn=new     SqlConnection(strConn);     

  cn.Open();     

                      string     sql="select     *     form     student";     

  SqlCommand     cm=new     SqlCommand(sql,cn);     

  SqlDataReader     dr=cm.ExecuteReader(CommandBehavior.CloseConnection);     

  SqlDataReader     dr     =     mydate.RunProcGetReader(sql);     

                              if(dr.Read())     

  {     

                                      .......读取数据     

                                        }     

      dr.Close();//关闭DataReader     

                      Response.Write(cn.State);//输出Connetion的状态  

结果运行这一段,输出:Closed   ,可见Connetion确实自动关闭了!但是如我在上面所说,我的Coonection是在函数在建立的,在函数中执行操作然后返回 DataReader,然后在外面读出数据,读取完毕后在外部关闭DataReader,这样函数中的Connetion会自动关闭吗?

自己做了个测试:(我们学习网-www.wearelearn.net)

public    SqlConnection conn;

protected void Page_Load(object sender, EventArgs e)

{

conn = new SqlConnection(DAL.SQLHelper.conn_String);

show();

}

//简单的封装方法
    protected static SqlDataReader reDatareader(SqlConnection conn)

{

SqlCommand cmd = new SqlCommand("select top 10 * from article ", conn );

conn.Open();

SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

return dr;

}
//应用封装方法
    protected SqlDataReader redr()

{

SqlDataReader dr = reDatareader(conn);

return dr;

}
//调用类,模拟3层构架。
    protected void show()

{

SqlDataReader dr = redr();

if (dr.HasRows)

{

while (dr.Read())

{

}

Response.Write(conn.State.ToString());

dr.Dispose();

Response.Write(conn.State.ToString());

}

}

结果输出 OpenClosed,呵呵,结果能关闭。

来自:http://hi.baidu.com/westfruit/blog/item/6ed56f1911927b4f43a9ad87.html

转载于:https://www.cnblogs.com/Godblessyou/archive/2012/05/23/2514486.html

asp.net中SqlDataReader使用时关闭数据库连接的问题(转)相关推荐

  1. linux应用参数 冒号,Lua-面向对象中函数使用时冒号(:)和点(.)的区别

    Lua-面向对象中函数使用时冒号(:)和点(.)的区别,我们先来看一段简单的代码: local Animal ={}functionAnimal:Eat( food )print("Anim ...

  2. boost中regex使用时出现的问题

    在使用到boost库中的regex的so文件中,如果出现如下错误: undefined symbol: _ZN5boost9re_detail14verify_optionsEjNS_15regex_ ...

  3. js中let使用时遇到的问题

    一开始我并未声明y,然后直接用了.第一段错误虽然提示的是y未定义,但是let x = y;其实还是执行了,这里涉及到变量提升问题.结果就是导致x实际上依旧被提升,即执行了let x;的操作,这一点在第 ...

  4. PowerDesigner15使用时的十五个问题

    2019独角兽企业重金招聘Python工程师标准>>> 转载:http://www.cnblogs.com/netsql/archive/2010/05/28/1746586.htm ...

  5. pd15不能连接oracle11g,PowerDesigner15 使用时的十五个问题附解决方法

    15个问题列表: 一般常用的有CDM,PDM,UML建模,CDM可以转为PDM. 支持正向[生成数据库]和逆向工程[从数据库中生成],并直接关联到到数据库中,PDM可以直接和数据库进行关联,并将数据库 ...

  6. ASP.NET中使用动态令牌进行安全认证

    一.前言 在有的项目中,为提高用户身份验证的安全性,需要在账号密码认证身份的基础上增加额外的认证,如加密狗.IC卡等.本例提供另一种方法,采用动态令牌的方式认证,用户在登录时需输入自己令牌产生的口令, ...

  7. 禁用计算机组策略和管理,计算机正在使用时,禁用或关闭组策略刷新 | MOS86

    点击此处修复Windows错误并提高系统性能 Group Policy(Windows 2000中引入的管理工具)可以确定组织中的用户和计算机的程序,网络资源和操作系统的运行方式.组策略可帮助用户通过 ...

  8. Java中当对象不再使用时,不赋值为null会导致什么后果 ?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | zhantong 来源 | https://w ...

  9. Java中随机数的原理,以及使用时的注意点

    转载自   Java中随机数的原理,以及使用时的注意点 1 前言 一提到 Java 中的随机数,很多人就会想到 Random,当出现生成随机数这样需求时,大多数人都会选择使用 Random 来生成随机 ...

  10. ASP.Net 中常用的数据库连接方式

    ASP.Net 中常用的数据库连接方式 在ASP.Net中,连接数据库有以下四种方式: 1.System.Data.OleDb.OleDbConnection 2.System.Data.SqlCl ...

最新文章

  1. leetcode--笔记——120. 三角形最小路径和
  2. ASCII 编码对照表
  3. IDEA 部署项目的时候出错:Jar not loaded错误
  4. http协议、cookie及session
  5. wxWidgets:支持插件的程序
  6. cad 打开硬件加速卡_为什么我能用CAD“飙车”?因为我用了这些加速秘笈
  7. ANSYS——相同模型不同创建方式的同载荷同约束下的比较
  8. [导入][导入][c#]Web开发中Tag的开发技巧
  9. Redis之key的淘汰策略
  10. UILabel和NSAttributedString那些事
  11. 【Java】java代理 静态代理 动态代理 proxy
  12. 独立站引流真的那么难吗?
  13. Clickhouse 数据库连接工具——DBeaver
  14. 【T+】删除/取消畅捷通T+软件登录账套后的“查看认证”按钮
  15. 前端学到什么程度才能叫精通?
  16. 用Python写个空课表生成器-Excel文件操作实例
  17. 肉价再次上涨 国家宏观调控成效遭受市场考验(转)
  18. 如何用css弄个七彩,CSS实现文字七彩呼吸灯动画
  19. 存档属性是做什么用的?
  20. SYS_CONTEXT函数返回IP地址的一些误解

热门文章

  1. android判断正确密码,Android 监听EditText输入框 ,判断输入的密码是什么格式
  2. vue中 点击二维码刷新图片(src不变)
  3. Android 换行符号(\n)放到Android当中的TextView显示双斜杠(\\n)
  4. ASP.NET验证码
  5. JEE5标准与Struts/Spring/Hibernate等诸多开源框架的比较分析
  6. js、jQuery实现自定义弹出框效果
  7. H5的sessionStorage 和 localStorage
  8. SQL--存储过程+触发器 对比!
  9. 小云(云层-陈霁)的发展史
  10. Group by的使用方法