/// <summary>
 ///		Obtiene un dataTable a partir de un nombre de una sentencia o procedimiento y sus parámetros
 /// </summary>
 public DataTable GetDataTable(string sql, ParametersDbCollection parameters, CommandType commandType, int pageNumber, int pageSize, TimeSpan?timeOut = null)
 {
     if (SqlParser == null || commandType != CommandType.Text)             // ... si no hay un intérprete de paginación en servidor, se obtiene el DataTable directamente de la SQL
     {
         return(GetDataTable(sql, parameters, commandType, timeOut));
     }
     else
     {
         return(GetDataTable(SqlParser.GetSqlPagination(sql, pageNumber, pageSize), parameters, commandType, timeOut));
     }
 }
 /// <summary>
 ///		Obtiene un dataTable a partir de un nombre de una sentencia o procedimiento y sus parámetros
 /// </summary>
 public async Task <DataTable> GetDataTableAsync(string sql, ParametersDbCollection parameters, CommandType commandType, int pageNumber, int pageSize,
                                                 TimeSpan?timeOut = null, CancellationToken?cancellationToken = null)
 {
     if (SqlParser == null || commandType != CommandType.Text)             // ... si no hay un intérprete de paginación en servidor, se obtiene el DataTable directamente de la SQL
     {
         return(await GetDataTableAsync(sql, parameters, commandType, timeOut, cancellationToken));
     }
     else
     {
         return(await GetDataTableAsync(SqlParser.GetSqlPagination(sql, pageNumber, pageSize), parameters, commandType, timeOut, cancellationToken));
     }
 }
 /// <summary>
 ///		Obtiene un IDataReader a partir de un nombre de una sentencia o procedimiento y sus parámetros paginando
 ///	en el servidor
 /// </summary>
 /// <remarks>
 ///		Sólo está implementado totalmente para los comandos de texto, no para los procedimientos almacenados
 /// </remarks>
 public IDataReader ExecuteReader(string sql, ParametersDbCollection parameters, CommandType commandType, int pageNumber, int pageSize, TimeSpan?timeOut = null)
 {
     if (commandType == CommandType.Text && SqlParser != null)
     {
         // Crea una colección de parámetros si no existía
         if (parameters == null)
         {
             parameters = new ParametersDbCollection();
         }
         // Obtiene el dataReader
         return(ExecuteReader(SqlParser.GetSqlPagination(sql, pageNumber, pageSize), parameters, commandType, timeOut));
     }
     else
     {
         return(ExecuteReader(sql, parameters, commandType, timeOut));
     }
 }
 /// <summary>
 ///		Obtiene un IDataReader a partir de un nombre de una sentencia o procedimiento y sus parámetros paginando
 ///	en el servidor de forma asíncrona
 /// </summary>
 /// <remarks>
 ///		Sólo está implementado totalmente para los comandos de texto, no para los procedimientos almacenados
 /// </remarks>
 public async Task <DbDataReader> ExecuteReaderAsync(string sql, ParametersDbCollection parameters, CommandType commandType, int pageNumber, int pageSize,
                                                     TimeSpan?timeOut = null, CancellationToken?cancellationToken = null)
 {
     if (commandType == CommandType.Text && SqlParser != null)
     {
         // Crea una colección de parámetros si no existía
         if (parameters == null)
         {
             parameters = new ParametersDbCollection();
         }
         // Obtiene el dataReader
         return(await ExecuteReaderAsync(SqlParser.GetSqlPagination(sql, pageNumber, pageSize), parameters, commandType, timeOut, cancellationToken));
     }
     else
     {
         return(await ExecuteReaderAsync(sql, parameters, commandType, timeOut, cancellationToken));
     }
 }