ADO.NET - Obtendo quantos registros um DataReader/DataSet vai retornar


 

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 . Neste caso usar um DataReader é menos oneroso para o desempenho do seu sistema.
  2. Você precisa acessar dados individuais localizados a cada momento para atualizar o seu sistema.
  3. Você precisa apenas de um acesso onde os dados não sofrerão atualizações nem buscas e serão somente exibidos.( i.e uma conexão do tipo somente-leitura e somente-para-frente)
  4. Você terá que fazer repetidas chamadas a base de dados para obter pequenas porções de informações

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

 

Usando um DataSet é muito fácil e no projeto abaixo eu vou mostrar fazer isto. Siga-me...

 

- Inicie um novo projeto no Visual Studio do tipo - Visual Basic Projects usando o template Windows Application

- O nome do projeto será NumeroLinhas e será salvo na pasta c:\vbnet

- No formulário padrão - form1.vb - insira dois controles Label , dois controle Buttons e uma caixa de texto , conforme figura abaixo:

No evento Click do botão de comando (button2) - DataSet - Exibir Números de registros - digite o seguinte código:

 

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

 

'define a string de conexão com o banco de dados

Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & TextBox1.Text

'define o objeto OledbConnection usando a string de conexão

Dim conexao As New OleDbConnection(strConn)

'define a instrução SQL que será usada para extrair as linhas da tabela Authors

Dim sql As String = "Select * from Pedidos"

'cria o objeto OleDbCommand

Dim comando As New OleDbCommand(sql, conexao)

'Cria o objeto DataAdapter

Dim adaptador As New OleDbDataAdapter(comando)

'Cria o objeto DataSet

Dim ds As New DataSet()

'preenche o dataset

adaptador.Fill(ds, "dsname")

'exibe os dados em um datagrid

Dim totalLinhas As Integer = ds.Tables("dsname").Rows.Count

Dim linhaAtual As Integer

Dim meuDataRow As DataRow

For Each meuDataRow In ds.Tables("dsname").Rows

  ' atualiza a label

  linhaAtual += 1

  Label1.Text = String.Format("{0}% complete", linhaAtual * 100 \ totalLinhas)

  Label1.Refresh()

Next

 

'exibe o total de linhas

Label1.Text = totalLinhas

conexao.close()

 

End Sub

 

Beleza !!! Mas eu quero saber sobre o DataReader...

 

Bem , eu já deixei o botão pronto para fazer a mesma coisa com o DataReader. No evento Click do botão(button1) insira o código :

 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

'define a string de conexão com o banco de dados

Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & TextBox1.Text

'define o objeto OledbConnection usando a string de conexão

Dim conexao As New OleDbConnection(strConn)

'abrindo a conexao

conexao.Open()

' le o numero de linhas

Dim cmd As New OleDbCommand("SELECT COUNT(*) FROM Pedidos", conexao)

Dim totalLinhas As Long = CInt(cmd.ExecuteScalar())

' le as linhas individuais

cmd = New OleDbCommand("SELECT * FROM Pedidos", conexao)

Dim dr As OleDbDataReader = cmd.ExecuteReader()

Dim linhaAtual As Integer

Do While dr.Read

  ' atualiza a label

  LinhaAtual += 1

  Label1.Text = String.Format("{0}% complete", linhaAtual * 100 \ totalLinhas)

  Label1.Refresh()

Loop

 

Label1.Text = "Total de registros na tabela = " & totalLinhas

dr.close()

conexao.Close()

End Sub

 

Como foi feito ? Simples , eu executei mais uma consulta SQL para ler o total de registros da tabela Pedidos. Veja a linha de código:

 

Dim cmd As New OleDbCommand("SELECT COUNT(*) FROM Pedidos", conexao) 

 

O inconveniente de se fazer isto é que estamos tendo uma carga a mais da consulta que vai ter que ira até o servidor para calcular os registros pois estamos usando uma consulta adicional no nosso código.

 

Se o banco de dados com o qual você estiver trabalhando suportar múltiplas consultas em um único comando você pode fazer assim :

 

Dim cmd As New OleDbCommand("SELECT COUNT(*) FROM Pedidos;SELECT * FROM Pedidos", conexao)
 

Gostou ???  Até mais...


José Carlos Macoratti