Dúvida ADO x Quantidade de Registros C#

11/01/2012

0

Salve galera. Sera que alguém pode me ajuda com uma dúvida.
Tenho um framework ao qual ja postei algumas dúvidas aqui no forúm, funciona muito bem usando o conceito de MVC e tudo mais.
Como preciso trabalha com N bancos não uso EF e nem nada disso, fiz na mão toda a parte de CRUD que por sinal também funciona muito bem.
A dúvida é a seguinte, imagina que tenho uma tabela no banco, TBCLIENTES com 500 mil clientes, e tenho uma tela que mostro esses clientes em um datagridview.
Básicamente quando construo a tela forço o usuário a filtrar o máximo possivel, para não ficar uma consulta pesada, mas mesmo assim pode acontecer da consulta acabar retornado 100 mil registros por exemplos.
Quando ele manda carregar os dados o framework cria uma lista do OBJETO CLIENTE_ENT e retorna para a tela essa lista, ai ela é vinculada ao datasource do datagridview, mais ou menos conforme abaixo:

List<Cliente_ENT> voClientes = new List<Cliente_ENT>();

DbCommand voComando   = _providerFactory.CreateCommand();
voComando.CommandType = CommandType.Text;
voComando.CommandText = SELECT * FROM TBCLIENTES;
voComando.Connection  = _conexao;
voComando.Transaction = _transacao;
   
DbDataReader voReader = voComando.ExecuteReader();

if (voReader.HasRows)
{
	while (voReader.Read())
	{
		Cliente_ENT voCli = new Cliente_ENT();
		
		//Preencho o objeto voCli.
		
		voClientes.Add(voCli);
	}
}	

return voClientes;


E se a consulta retornar os 100 mil registros por exemplo a operação vai ficar impossível de ser realizada.
Então ai vai algumas dúvidas, esquecendo um pouco o cenário que tenho de MVC e tudo mais, se eu fosse simplesmente preencher esses dados em um DataGridView usando ADO:
- O ADO tem algum jeito que ele traz uma certa quantia e a medida que vou rolando as linhas ele vai trazendo automaticamente as demais linhas do banco e adicionado no grid? (Talvez ele faça isso nativamente nessa situação e eu não saiba).
- No meu caso, usando uma ENTIDADE (CLIENTE_ENT), teria como fazer algo semelhante?

Fico no aguardo dos comentários. Obrigado.
Francisco Gimenez

Francisco Gimenez

Responder

Posts

12/01/2012

Leandro Ribeiro

Que eu saiba não dá para fazer isso no ado.net.

Não sei se você já tentou algo parecido, mas dá para fazer isso nas próprias consultas de BD.

No sql server 2005 por exemplo pode ser feito assim:

Pegar os primeiros 10 registros

SELECT  Desc, Data
FROM     (SELECT  TOP 10 ROW_NUMBER() OVER (ORDER BY Data DESC)
             AS Row, Desc, Data FROM Tabela)
            AS RowNumbers
WHERE  Row >= 1 AND Row <= 10


Pegar os próximos 10 registros

SELECT  Desc, Data
FROM     (SELECT  TOP 20 ROW_NUMBER() OVER (ORDER BY Data DESC)
             AS Row, Desc, Data FROM Tabela)
            AS RowNumbers
WHERE  Row >= 11 AND Row <= 20



Responder

12/01/2012

Francisco Gimenez

Legal, eu pensei nisso mesmo, tratar direto no SQL usando LIMIT ou coisa parecida.
É que eu vi em algum lugar uma vez que dava pra deixa o componente (datagridview) ligado a fonte de dados e conforme você fosse rolando os dados ele ia automaticamente pegando os dados no banco.
Responder

12/01/2012

Leandro Ribeiro

Legal. Bom como disse eu não sei se da para fazer isso. O mais perto que eu ja vi foi carregar o result set inteiro em uma sessão por exemplo, e ir paginando no DataGrid, chamando essa sessão.

Se você descobrir como fazer isso direto do banco posta pra gente blz?

Abraços.


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar