DataGrid - Paginado com grande quantidade de registros

 

Muitos de vocês estão familiarizados com paginação no DataGrid do ASP.NET. Além disso, muitos de vocês devem saber que os métodos padrões de paginação do framework .NET não funcionam (é claro, não devemos culpar a tecnologia por isso). Então, neste artigo, gostaria de mostrar a vocês um eficiente método de paginação para resultados de consultas SQL com grande quantidade de registros.

Utilizando o código

Para os métodos abaixo você precisa definir quais tabelas e colunas você deseja consultar do BD. Além disso, você precisa determinar quais joins das tabelas serão utilizados e que ordenação será utilizada. Então vamos começar.

Este método é utilizado para pegar a quantidade de registros da consulta (é necessário para paginação, como será mostrado adiante):

 

public int GetRecordCount(string tableName)

{

    string sql = "select count(*) from "+ tableName;

    return Convert.ToInt32(executeScalar(sql));

}

 

Este método é utilizado para criar uma consulta SQL para o banco de dados:

public string CreateSql(int pageNumber, int pageSize, string primaryKey,

  string fieldNames, string fromTables,

  string condition, string orderBy)

{

    string sql = " SELECT TOP "+pageSize+" "+

      fieldNames+" FROM "+ fromTables +" ";

    if (condition!=null && !string.Empty.Equals(condition))

    {

        if (!condition.ToLower().Trim().StartsWith("where"))

        {

            sql += " where ";

        }

        sql += condition + " and ";

       

    }

    if (sql.ToLower().IndexOf("where")==-1)

        sql+= " where ";

 

    sql+= " " +primaryKey +" NOT IN " +

          " (SELECT TOP "+(pageNumber*pageSize)+

          " "+primaryKey+" FROM " + fromTables+" ";

    if (condition!=null && !string.Empty.Equals(condition))

    {

        if (!condition.ToLower().Trim().StartsWith("where"))

        {

            sql += " where ";

        }

        sql += condition;

    }

 

    if (orderBy!=null && !string.Empty.Equals(orderBy))

    {

        sql+= " ORDER BY "+orderBy+") "+

            " ORDER BY "+orderBy;

    }

    else

    {

        sql+=")";

    }

    return sql;

}

 

Executando a consulta SQL:

public void RunSql(string sqlString,

  out SqlDataReader dataReader)

{

    SqlCommand cmd = CreateSqlCommand(sqlString,  null);

    dataReader = cmd.ExecuteReader();

}

 

Estão disponíveis dois métodos sobrecarregados para criação de consultas. O primeiro é utilizado quando o número total de registros da consulta (não em uma página) é conhecido, o segundo no outro caso.

 

public SqlDataReader GetListByPage (int pageNumber, int pageSize,

  string primaryKey, string fieldNames,

  string fromTables, string condition, string orderBy)

{

    string sql= CreateSql (pageNumber,pageSize, primaryKey,

      fieldNames,fromTables,condition,orderBy);

    SqlDataReader dr;

    RunSql(sql, out dr);

    return dr;

}

public SqlDataReader GetListByPage (out int rowcount, int pageNumber,

  int pageSize, string primaryKey, string fieldNames,

  string fromTables, string condition, string orderBy)

{

    string countSql = fromTables;

    if (condition!=null && !string.Empty.Equals(condition))

    {

 

        if (!condition.ToLower().Trim().StartsWith("where"))

        {

            countSql += " where ";

        }

        countSql += condition;

    }

    rowcount = GetRecordCount(countSql);

    return GetListByPage(pageNumber, pageSize, primaryKey,

      fieldNames, fromTables, condition, orderBy);       

}

 

Aqui está um pequeno exemplo de como utilizar este código:

 

myDataGrid.DataSource = db.GetListByPage(out rowcount,

  PageIndex,myDataGrid.PageSize,

  "KeyField",fieldNames,tables,

  search,OrderBy);

myDataGrid.VirtualItemCount = rowcount;

myDataGrid.CurrentPageIndex = PageIndex;

 

Não esqueça de alterar a propriedade AllowCustomPaging para True em seu DataGrid.