zoukankan      html  css  js  c++  java
  • C#使用SqlDataReader读取数据库数据时CommandBehavior.CloseConnection参数的作用

    主要用在ExecuteReader(c)中,如果想要返回对象前不关闭数据库连接,须要用CommandBehavior.CloseConnection; CloseConnection解决了流读取数据模式下,数据库连接不能有效关闭的情况。当某个XXXDataReader对象在生成时使用了CommandBehavior.CloseConnection,那数据库连接将在XXXDataReader对象关闭时自动关闭。

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

    /// <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();
            //SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            return dr;
        }
        finally
        {
            //这里的代码处于两难的境地,如果这里执行关闭:con.Close();那返回的SqlDataReader将毫无用处,因为其依赖的连接已经关闭
            //如果这里不执行con.Close();那返回后该连接将永远无法关闭,因为调用方无法得到连接对象con,无法在调用处执行关闭
        }
    }  

    正如代码注释里描述的那样,这样的方法既不能关闭连接,也不能保持连接打开状态。很多系统为了解决这样两难的境地,只能放弃使用Reader模式的数据源,或者把连接对象交给方法调用者,以便进行关闭。
    而CommandBehavior.CloseConnection的功能恰好就是为了避免类似的尴尬境地,它能够保证当SqlDataReader对象被关闭时,其依赖的连接也会被自动关闭CommandBehavior.

  • 相关阅读:
    PostgreSQL安装的后续工作
    进程在Linux上实际需要多少内存
    PostgreSQL的大对象以及空间使用 (3)
    PostgreSQL的大对象以及空间使用 (2)
    PostgreSQL的大对象以及空间使用 (1)
    PostgreSQL的WAL(4)--WAL创建和调优
    Cannot set Column 'EffectiveDate' to be null. Please use DBNull instead.
    除去datatable的空行
    sql like in 语句获取以逗号分割的字段内的数据
    el-cascader 设置选中任意一级
  • 原文地址:https://www.cnblogs.com/ymtianyu/p/5645724.html
Copyright © 2011-2022 走看看