Bem, qual a melhor forma de transportar dados em uma aplicação Web? Se estivesse trabalhando em uma aplicação Windows Forms, acho interessante o uso do Dataset, visto que muitas vezes a conexão com a internet ou mesmo com o servidor de DB não é contínua, e sendo assim, não é possível a cada dado que precisarmos irmos até este servidor, buscar o que necessitamos. É neste cenário que olho com bons olhos para o Dataset, onde recuperamos os dados de uma DB qualquer, armazenamos neste Dataset, fechando a conexão com o servidor de DB e trabalhamos com esse Dataset, desconectado!
Uma vez que finalizamos o trabalho neste dados desconectados, reabrimos a conexão com a DB e persistimos esses na Base de Dados e pronto, tudo já estará lá atualizado.
Vale lembrar que quando estou me referindo à Windows Forms, estou querendo abranger sistemas para Windows – Desktop, ou mesmo aplicações para Pockets. Mas agora, e em uma aplicação Web? Será que vale mesmo a pena utilizar Datasets em uma aplicação ASP.NET? Na minha opinião, não acho isso lá muito interessante.
Se para acessar e trabalhar em uma aplicação ASP.NET/Web, tem que estar 100% OnLine, então vejo que não há a necessidade de utilizar o Dataset para recuperar e trabalhar com esses dados “localmente”. Já sabemos que o uso do DataReader é muitas vezes mais rápido que o Dataset (isso evita colocar aqui PPT’s que confirmem isso :P), e é uma ótima opção. Quem realmente defende Datasets, condenam os DataReaders por eles serem somente “foward-only” e “read-only”, que somente com essas características não é possível trabalhar com os dados “desconectadamente”.
Fiz todos os cursos da carreira MCSD.NET, e vi exaustivamente Datasets nestes cursos (que pelo fato de não usá-los, não me recordo), inclusive no curso de ASP.NET, ou seja, a Microsoft também “prega” o uso deles. Se o mesmo demora muito à carregar, então porque não se utiliza DataReader para recuperar e assim exibir os dados? Talvez o conceito de Datasets não está muito bem definido para o pessoal, visto que vejo códigos do tipo:
Private Sub Page_Load(…)
If Not Page.IsPostBack() Then
CarregaDS()
End If
End Sub
Private Sub CarregaDS()
MeuDataAdapter.Fill(MeuDataSet)
MeuDataGrid.DataSource = MeuDataSet
MeuDataGrid.DataBind()
End Sub
Private Sub DataGrid1_PageIndexChanged(….)
MeuDataGrid.CurrentPageIndex = e.NewPageIndex
CarregaDS()
End Sub
Como podem ver neste caso, estamos usando um objeto extremamente pesado para carregar os dados da DB (isso sem contar quando o Dataset não é armazenado em Session). Para isso, ao invés de utilizar Dataset, porque não utilizam DataReader, recuperando da DB apenas os registros que são necessários para a construção e exibição da página (me refiro à paginação do DataGrid) requerida pela usuário?
Sem contar que, se criar uma aplicação realmente orientada à objetos, deve ficar terrivelmente complicado preencher e popular os objetos da aplicação, objetos quais deixam a aplicação mais próxima do mundo real. E aqui entraria o OR/M, mas deixa isso para um outro post/artigo.
Pois bem, na minha opinião, não acho o uso de Datasets viável em uma aplicação Web, ou melhor, talvez há alguma utilidade sim, como por exemplo para armazenar um retorno de Web Services, mas fora isso, acho que o DataReader muito mais ideal, mesmo sendo somente leitura.
Update:
Com relação ao CRUD na DB, claro que não utilizo o Dataset para isso, ou seja, executo os comandos diretamente na DB. Se for alguma aplicação (claro, ASP.NET) simples, utilizo uma DAL, mas se for algo mais complexo, o ideal é modelar calmamente, e assim criar aos DAOs que serão responsáveis pela persistência dos objetos na DB. Viva o OR/M 🙂