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 PomaricoComo 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 :
- Os dados com os quais você esta trabalhando precisam estar sempre atualizados, ou seja, você precisa de dados on-line em tempo real.
- 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:
- 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.
- 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.
- Entity Framework 4: Repositório GenéricoVisual Basic .NET
- As edições 14 da Easy .net Magazine e 88 da .net Magazine já estão disponíveis.ADO.NET
- Postando no Twiiter com .NET e Migre.meC#
- Setup ApplicationsVisual Basic .NET
- Problemas na manipulação de arquivos do MS Excel com .NETVisual Basic .NET