segunda-feira, agosto 18, 2008

ASP.NET: DataSet vs DataReader (Pt. 01/03)

Tenho estado a trabalhar em ASP.NET e uma das grandes questões que surgiram tem a haver com a exportação dos dados da Base de Dados (SQL Server) para a aplicação C#/VB.NET.

Numa primeira tentativa, experimentei o DataSet como arquitectura para gestão do banco de dados e revelou-se um objecto poderoso, com imensas propriedades, imensos pormenores. Um DataSet acaba por ser um conjunto de tabelas da BD, onde são guardadas todas as linhas devolvidas pela instrução SQL. Estes dados são então tratados offline, ou seja, os dados podem ser alterados no dataset e não interfere com os dados existentes no banco de dados. Isto é muito útil para a manipulação de dados, controlo de cache, entre outras situações.

No entanto, depressa cheguei à conclusão que isto consumia muitos recursos, tanto é que o DataSet tem imensa informação desnecessária. Tive a ver e o payload do DataSet é simplesmente enorme.

Procurei uma solução. DataReader surgiu como a alternativa. Ora qual a diferença entre o DataReader e o DataSet? Primeiro que tudo, o DataReader trata os dados online, ao contrário do DataSet. Este objecto funciona como stream para o banco de dados e deve ser fechado depois de executados os comandos pretendidos. Esta é uma solução muito mais viável a nível de recursos, visto que consome muito, mas muito menos que o DataSet. Desvantagem? A flexibilidade é a grande desvantagem. Ao contrário do DataSet em que se pode manipular os dados directamente, o DataReader funciona como forward-only, ou seja, funciona como um array de dados que só pode estar a apontar para uma linha apenas, e só num sentido.


What is a DataReader?
A DataReader is a read-only stream of data returned from the database as the query executes. It only contains one row of data in memory at a time and is restricted to navigating forward only in the results one record at a time. The DataReader does support access to multiple result sets, but only one at a time and in the order retrieved. Just as in the original version of ADO, the data is no longer available through the DataReader once the connection to the data source is closed, which means a DataReader requires a connection to the database throughout its usage. Output parameters or return values are only available through the DataReader once the connection is closed.

What is a DataSet?
DataSet is the core of the ADO.NET disconnected architecture and is used to store data in a disconnected state..



Basicamente, estamos a falar dum cenário assim:

  • Data Reader - Forward only where as Dataset - Can loop through datas
  • Data Reader - Connected Recordset where as DataSet - Disconnected Recordset
  • Data Reader - Less Memory Occupying where as DataSet - It occupies more memory
  • Data Reader - Only Single Table can be used where as Dataset - Datatable Concept allows data to be stored in multiple tables.
  • Data Reader - Read only where as DataSet - Can add/update/delete using the dataset
  • Data Reader - No relationship can be maintained where as DataSet - Relationship can be maintained.
  • Data Reader - No Xml Storage available where as DataSet - Can be stored as XML.

De seguida, mostro um excelente artigo de Scott Mitchell, um dos fundadores do 4GuysFromRolla.

Sem comentários: