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 :
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 DataRowFor 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