public static IDataReader ExecuteReader(IDbCommand command, string description, bool isApplication, bool transformParameters, bool skipLog)
        {
            try {
                // Save the values before execution because sometimes the drivers clears them from the IDbCommand when an exception occurs
                IDbCommand     cmd   = ADOAdaptersUtils.GetADOCommand(command);
                IDbConnection  conn  = cmd.Connection;
                IDbTransaction trans = cmd.Transaction;

                IDatabaseAccessProvider provider = null;
                bool hasProvider = trans != null && DatabaseAccess.TryGetProviderForTransaction(trans, out provider);

                IExecutionService   executionService = hasProvider ? provider.DatabaseServices.ExecutionService : GetExecutionForConnection(conn);
                ITransactionManager manager          = provider.TransactionManager;

                IDataReader reader = null;
                try {
                    if (transformParameters)
                    {
                        TransformParameters(cmd);
                    }
                    reader = executionService.ExecuteReader(cmd);
                    // NOTE: This reader will be closed automatically by the transaction manager at the end of the request
                    manager.AssociateReader(trans, reader);
                } catch (DbException e) {
                    executionService.OnExecuteException(e, cmd, reader, conn, trans, manager);
                    throw;
                }
                return(reader);
            } catch (InvalidDatabaseAccessException e) {
                throw new InvalidDBTransactionManagerAccess(e.Message);
            }
        }