Array
(
)

Dúvida ADO x Quantidade de Registros C#

Rodrigo Gimenez
   - 11 jan 2012

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:
#Código

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.

Leobower
   - 12 jan 2012

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

#Código

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

#Código
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



Rodrigo Gimenez
   - 12 jan 2012

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.

Leobower
   - 12 jan 2012

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.