Пример #1
0
        /// <summary>
        /// Create and prepare a IDbCommand, and call ExecuteReader with the appropriate CommandBehavior.
        /// </summary>
        /// <remarks>
        /// If we created and opened the connection, we want the connection to be closed when the DataReader is closed.
        /// 
        /// If the caller provided the connection, we want to leave it to them to manage.
        /// </remarks>
        /// <param name="connection">a valid IDbConnection, on which to execute this command</param>
        /// <param name="transaction">a valid IDbTransaction, or 'null'</param>
        /// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
        /// <param name="commandText">the stored procedure name or T-SQL command</param>
        /// <param name="commandParameters">an array of IDataParameters to be associated with the command or 'null' if no parameters are required</param>
        /// <param name="connectionOwnership">indicates whether the connection parameter was provided by the caller, or created by DbHelper</param>
        /// <returns>IDataReader containing the results of the command</returns>
        private static IDataReader ExecuteReader(IDbConnection connection, IDbTransaction transaction, CommandType commandType, string commandText, IDataParameter[] commandParameters, IDbConnectionOwnership connectionOwnership)
        {
            //create a command and prepare it for execution
            IDbCommand cmd = connection.CreateCommand();
            PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters);

            //create a reader
            IDataReader dr;

            // call ExecuteReader with the appropriate CommandBehavior
            if (connectionOwnership == IDbConnectionOwnership.External) {
                dr = cmd.ExecuteReader();
            }
            else {
                dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }

            // detach the IDataParameters from the command object, so they can be used again.
            cmd.Parameters.Clear();

            return dr;
        }
Пример #2
0
		/// <summary>
		/// 执行指定数据库连接对象的数据阅读器.
		/// </summary>
		/// <remarks>
		/// 如果是BaseDbHelper打开连接,当连接关闭DataReader也将关闭.
		/// 如果是调用都打开连接,DataReader由调用都管理.
		/// </remarks>
		/// <param name="connection">一个有效的数据库连接对象</param>
		/// <param name="transaction">一个有效的事务,或者为 'null'</param>
		/// <param name="commandType">命令类型 (存储过程,命令文本或其它)</param>
		/// <param name="commandText">存储过程名或SQL语句</param>
		/// <param name="commandParameters">IDataParameters参数数组,如果没有参数则为'null'</param>
		/// <param name="connectionOwnership">标识数据库连接对象是由调用者提供还是由BaseDbHelper提供</param>
		/// <returns>返回包含结果集的IDataReader</returns>
		private static IDataReader ExecuteReader(IDbConnection connection, IDbTransaction transaction, CommandType commandType, string commandText, IDataParameter[] commandParameters, IDbConnectionOwnership connectionOwnership)
		{
			if (connection == null) throw new ArgumentNullException("connection");

			bool mustCloseConnection = false;
			// 创建命令
			IDbCommand cmd = Factory.CreateCommand();
			try
			{
				PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection);

				// 创建数据阅读器
				IDataReader dataReader;

				if (connectionOwnership == IDbConnectionOwnership.External)
				{
					dataReader = cmd.ExecuteReader();
				}
				else
				{
					dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
				}
				
                m_querycount++;

				// 清除参数,以便再次使用..
				// 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 (IDataParameter commandParameter in cmd.Parameters)
				{
					if (commandParameter.Direction != ParameterDirection.Input)
						canClear = false;
				}
				
				
				if (canClear)
				{
					cmd.Dispose();
					cmd.Parameters.Clear();
				}

				return dataReader;
			}
			catch
			{
				if (mustCloseConnection)
					connection.Close();
				throw;
			}
		}