关于IDataReader的释放

关于IDataReader的释放

起初使用IDataReader时并不是很了解。以为执行完 cmd.ExecuteReader();数据库就可以关闭了。但是发现没有数据返回,代码如下

    public  IDataReader MyDataReader(IDbCommand _cmd)
    {
        if (_cmd == null)
            return null;
        try
        {
            conn.Open();
            _cmd.Connection = conn; 
            IDataReader dr = _cmd.ExecuteReader();
            conn.Close();
            return dr;
        }
        catch (Exception e)
        {
        }
    }

从上面的代码来看,当返回dr时数据库连接已经关闭了,然而还没有获得数据。在数据没读到之前数据库连接不能关闭。参考了微软写的数据库帮助类。其中有这样的代码

  private static SqlDataReader ExecuteReader(SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, SqlParameter[] commandParameters, SqlConnectionOwnership connectionOwnership)
        {    
            if( connection == null ) throw new ArgumentNullException( "connection" );
            bool mustCloseConnection = false;
            // 创建命令
            SqlCommand cmd = new SqlCommand();
            try
            {
                PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection );
            
                // 创建数据阅读器
                SqlDataReader dataReader;
                if (connectionOwnership == SqlConnectionOwnership.External)
                {
                    dataReader = cmd.ExecuteReader();
                }
                else
                {
                    dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                }
            
                // 清除参数,以便再次使用..
                // HACK: There is a problem here, the output parameter values are fletched 
                // when the reader is closed, so if the parameters are detached from the command
                // then the SqlReader can磘 set its values. 
                // When this happen, the parameters can磘 be used again in other command.
                bool canClear = true;
                foreach(SqlParameter commandParameter in cmd.Parameters)
                {
                    if (commandParameter.Direction != ParameterDirection.Input)
                        canClear = false;
                }
            
                if (canClear)
                {
                    cmd.Parameters.Clear();
                }
                return dataReader;
            }
            catch
            {
                if( mustCloseConnection )
                    connection.Close();
                throw;
            }
        }
没有直接关闭数据库连接。而是在调用完这个函数之后释放数据库连接。其中
dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
CommandBehavior.CloseConnection的意思是:如果关闭相关联的 DataReader对象,则关联的Connection对象也将关闭。从此我们了解到DataReader对象不应在数据库帮助类中关闭,而是应该在调用该函数之后释放。

有关微软的数据帮助类

下载地址:http://download.csdn.net/detail/awakeningwolf/8958137

你可能感兴趣的:(小知识)