Desenvolvimento - Visual Basic .NET

Trabalhando com Dados em .NET

Em se tratando de acesso a dados em VB.Net e ASP.Net temos duas, DataSet e DataReader. Mas em relação ao desempenho? Saiba um pouco do que são essas duas formas de acesso a dados.

por David Pomarico



Utilizando DataReader

Como você já deve saber , o objeto DataReader pode ser usado para ler os dados retornados pelos objetos Command.

Ele permite acessar e percorrer os registros no modo de somente leitura e somente para frente - forward-only.

O DataReader não oferece acesso desconectado e não permite alterar ou atualizar a fonte de dados original, sendo usado para obter rapidamente dados de apenas leitura. Apresenta poucos recursos mas seu desempenho é muito melhor do que o oferecido pelo objeto DataSet.

Situações quando o uso de DataReader é recomendado :

  1. Os dados com os quais você esta trabalhando precisam estar sempre atualizados, ou seja, você precisa de dados on-line em tempo real.

  2. Você precisa apenas de um acesso onde os dados não sofrerão atualizações nem buscas (filtros) e serão somente exibidos.

Pelos motivos acima não existe uma forma de você saber quantas linhas de uma tabela serão retornados pelo objeto DataReader.

Bom, agora que você já sabe para que serve e em qual situação utilizá-lo, vou mostrar um exemplo de um DataReader:

Private sub CarregaDados()

Dim conn As New SqlConnection()
Dim DR As SqlDataReader
 
conn.ConnectionString = "string de conexão"
Dim cmd As SqlCommand = conexao.CreateCommand
 
cmd.CommandText = "Select CódigoDoFuncionário, Nome ,SobreNome,Cargo From Funcionários"
conexao.Open()
 
DR = cmd.ExecuteReader()

While DR.Read
    MsgBox DR.Item(0)
End While
 
dr.Close()
conexao.Close()

End Sub

Utilizando DataSet

Para acessar o banco de dados, executar o comando SQL via DataAdapter, trazer os dados e preencher o DataSet usamos o método Fill, que retorna as linhas de uma fonte de dados usando a declaração SELECT definida por uma propriedade SelectCommand associada.

A principal característica do DataSet é totalmente trabalhar desconectado e você pode usar um DataSet para retornar dados de um banco de dados e também para mover os dados de um DataSet para um banco de dados. Porém o próprio DataSet não faz conexão alguma com o banco de dados, ele nem mesmo tem um objeto para realizar tal conexão. A ligação entre o banco de dados e o DataSet é feita pelo objeto DataAdapter (Adaptador de dados). Abaixo uma ilustração que procura mostrar a interação entre os objetos ADO.NET e o modelo desconectado com o DataSet.

Private Sub CarregaDataSet()
Dim strConn As String = "string de conexão"
Dim conn As New OleDbConnection(strConn)

Dim sql As String = "Select * from tblClientes Where cli_ID < 20"

Dim cmd As New OleDbCommand(sql, conn)
Dim AD As New OleDbDataAdapter(cmd)

Dim DS As New DataSet()

DA.Fill(DS, "Clientes")
End Sub

A diferença entre DataReader e DataSet

Em se tratando de acesso a dados em VB.Net e ASP.Net temos duas, DataSet e DataReader. Mas em relação ao desempenho?

Quando falamos de desempenho, a utilização de um DataReader leva vantagem, pois obtem o acesso aos dados assim que o objeto fica disponível, do contrário do DataSet que é necessário aguardar seu preenchimento, além disso o DataReader é do tipo ForwardOnly (dados somente leitura e com acesso do primeiro registro até o último). Já o DataSet você pode navegar pelos dados tanto para frente como para trás.

Vantagens entre DataReader e DataSet

A seguir temos um código que preenche um DataSet com o resultado de uma tabela e exibe o primeiro campo em cada linha:

Dim conn As New SqlConnection(connectionString)
Dim da As New SqlDataAdapter("select * from tabela;", conn)

Dim ds As New DataSet()
da.Fill(ds)

Dim dr As DataRow
For Each dr In ds.Tables(0).Rows
    Console.WriteLine(dr(0).ToString())
Next dr

Observando o código você pode notar que a leitura dos dados feita no loop for each começa somente após o DataSet ter sido preenchido. Você não pode realizar outra tarefa enquanto o DataSet estiver sendo preenchido.

Vamos ver agora o código que realiza a mesma tarefa usando um DataReader:

Dim con As New SqlConnection(connectionString)
Dim cmd As New SqlCommand("select * from tabela", con)

cmd.Connection.Open()

Dim dr As SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)

While dr.Read()
   Console.WriteLine(dr.GetString(0))
End While

dr.Close()
con.Close()

Neste caso a leitura dos dados é feita assim que os dados estiverem disponíveis, onde dr.Read() retorna false se não encontrar dados. O DataReader armazena um resultado por vez no cliente, e com isto reduz o uso de memória e recursos do sistema.

Então usar um DataReader é mais rápido que usar um DataSet, Certo? A resposta é sim... depende.

Lembre-se de que ao escolher usar um DataReader somente olhando a questão do desempenho irá fazer com que você não tenha acesso a algumas funcionalidades iguais ao do DataSet, por exemplo a filtragem de dados.

A única justificativa no uso do DataReader seria para popular dados "somente leitura" (forward only), por exemplo para popular um DataGrid ou um Relatório.

Você pode aumentar o desempenho de um DataSet desativando algumas funcionalidades, se não utilizadas:

  1. ds.EnforceConstraints = false - desabilita a verificação das restrições de integridade referencial durante a operação e pode tornar a operação mais rápida.

  2. Executamos o método BeginLoadData antes de usar o método Fill para desabilitar a notificação, indexação. E depois executamos o método EndLoadData depois de usar o método Fill para habilitar a indexação a notificação.
ds.Tables.Add("tblClientes");
ds.Tables["tblClientes"].BeginLoadData();
da.Fill(ds.Tables["tblClientes"]);
ds.Tables["tblClientes"].EndLoadData();
Com isto melhoramos o desempenho do DataSet e justificamos sua utilização a fim de podermos usar seus recursos.
David Pomarico

David Pomarico - Analista de Sistemas, MCP (Micrososft Certified Professional) em ASP.NET e WindowsForms, atualmente trabalhando em uma multinacional, graduado em Tecnologia em Desenvolvimento de Softwares na Faculdade Informática e Administração Paulista (FIAP), Co-Líder do Grupo de Usuários Codificando.Net SP (www.codificando.net), experiência de 2 anos em .NET, conhecimentos e práticas em Framework .NET, ASP.NET, WinForms, Pocket PC, VB.NET, C#, Crystal Reports.NET, Active Reports for .NET, MS SQL 2000, Oracle 9i, UML, XML.
Visite o meu The spoke: http://br.thespoke.net/MyBlog/dpomarico/MyBlog.aspx