Aquí mi problema, estoy usando asp.net para mi sitio, obtengo una lista de libros y los muestro, todo está bien. ahora trato de ordenar estos libros por título, autor u otro atributo, estoy usando este código:

public static IDataReader GetPageByCritere(
        int pageNumber,
        int pageSize,
        out int totalPages,
        string critere,
        string direction)
    {
        int pageLowerBound = (pageSize * pageNumber) - pageSize;
        totalPages = 1;
        int totalRows = GetCount();

        if (pageSize > 0) totalPages = totalRows / pageSize;

        if (totalRows <= pageSize)
        {
            totalPages = 1;
        }
        else
        {
            int remainder;
            Math.DivRem(totalRows, pageSize, out remainder);
            if (remainder > 0)
            {
                totalPages += 1;
            }
        }

        StringBuilder sqlCommand = new StringBuilder();
        sqlCommand.Append("SELECT * ");
        sqlCommand.Append("FROM a_book ");
        //sqlCommand.Append("WHERE  ");
        sqlCommand.Append("ORDER BY ?Critere ?direction ");
        sqlCommand.Append("LIMIT ?PageSize ");

        if (pageNumber > 1)
        {
            sqlCommand.Append("OFFSET ?OffsetRows ");
        }

        sqlCommand.Append(";");

        MySqlParameter[] arParams = new MySqlParameter[4];

        arParams[0] = new MySqlParameter("?PageSize", MySqlDbType.Int32);
        arParams[0].Direction = ParameterDirection.Input;
        arParams[0].Value = pageSize;

        arParams[1] = new MySqlParameter("?OffsetRows", MySqlDbType.Int32);
        arParams[1].Direction = ParameterDirection.Input;
        arParams[1].Value = pageLowerBound;

        arParams[2] = new MySqlParameter("?Critere", MySqlDbType.VarChar, 50);
        arParams[2].Direction = ParameterDirection.Input;
        arParams[2].Value = critere;

        arParams[3] = new MySqlParameter("?direction", MySqlDbType.VarChar, 50);
        arParams[3].Direction = ParameterDirection.Input;
        arParams[3].Value = direction;

        return MySqlHelper.ExecuteReader(
            GetReadConnectionString(),
            sqlCommand.ToString(),
            arParams);
    }
}

Cuando ejecuto este código, los libros no se ordenan, obtengo la primera lista de elementos sin ordenar, aquí mi sqlCommand y arParams para ordenar con título por ejemplo: sqlCommand

 {SELECT * FROM a_book ORDER BY ?Critere ?direction LIMIT ?PageSize ;}

ArParams:

 {?PageSize} : 20 {?OffsetRows} : -20 {?Critere} title {?direction} DESC

Por favor ayuda, no encontré ninguna solución.

0
Elyes Jlassi 20 feb. 2012 a las 15:36

1 respuesta

La mejor respuesta

Desafortunadamente, esto solía funcionar en MySql, pero luego el comportamiento cambió; consulte http: // bugs .mysql.com / bug.php? id = 31474. Ahora se comporta como Oracle y SQL Server a este respecto.

En su lugar, es posible que desee considerar la creación de su pedido basándose en los criterios; con suerte, un usuario no ingresa su cadena de criterios ni se obtiene a partir de la entrada del usuario; de lo contrario, tendrá que protegerse contra la Inyección de SQL .

Si sus criterios constan de una sola columna, simplemente puede hacer algo como:

sqlCommand.Append(String.Format("ORDER BY {0} {1}", Critere, direction))

Si Critere tiene varias columnas, es posible que desee considerar pasar sus criterios de clasificación como una lista de dirección de columna.

Esto también se cubre aquí: Parámetro en orden por cláusula doesn 't orden -mysql, C #

1
Community 23 may. 2017 a las 15:03
Gracias por su respuesta, lo arreglé usando string str = "ORDER BY" + critere + "" + direction; sqlCommand.Append (str); lo mismo nosotros: sqlCommand.AppendFormat ("ORDER BY {0} {1}", Critere, dirección) muchas gracias.
 – 
Elyes Jlassi
20 feb. 2012 a las 17:29