VB.NET - Operações com Dados que retornam registros


Podemos ter operações com dados que retornam apenas um determinado registro selecionado. ADO.NET permite obter e modificar um determinado registro de diversas maneiras.

Neste artigo iremos ver algumas das técnicas que podemos usar para obter um registro selecionado de uma fonte de dados.

Estarei usando o SQL Server 2000 e o banco de dados TesteWind para realizar as operações. Vamos lá...

Podemos retornar dados usando uma expressão SQL com o comando SELECT e um parâmetro de saída usando o objeto Command da ADO.NET, o objeto DataReader ou o objeto DataSet.

1- Obtendo um valor específico - Usando o objeto Command

O objeto Command fornece o método ExecuteScalar que permite retornar um valor único de uma fonte de dados. Este método executa uma consulta e retorna a primeira coluna da primeira linha do conjunto de registros retornado. O conjunto de registros pode conter múltiplas linhas mas o método ExecuteScalar irá ignorá-las.

No código abaixo temos um exemplo que usa o método ExecuteScalar do objeto Command para retornar um único valor da tabela Pedidos do banco de dados TesteWind do SQL Server. No caso estarei retornando o nome do destinatário usando uma stored procedure que usa como parâmetro de entrada o número do pedido que fornecido pelo controle NumericUpDown que possui o intervalo dos números de pedidos (10248 a 11077).

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'define as variaveis para conexao,comando, parametro e nome do destinario do pedido
        Dim sqlConn As SqlConnection
        Dim sqlCmd As SqlCommand
        Dim param As SqlParameter
        Dim nomeDestinatario As String
        Try
            'Cria um novo objeto connecation
            sqlConn = New SqlConnection("Data Source=MACORATTI;" & _
                                        "Integrated Security=SSPI;Initial Catalog=TesteWind")
            'Cria um novo objeto command
            sqlCmd = New SqlCommand
            'Especifica a stored procedure e a conexao
            With sqlCmd
                'define o tipo de comando
                .CommandType = CommandType.Text
                'define o comando sql 
                .CommandText = "Select NomeDoDestinatário from Pedidos Where NúmeroDoPedido=@NumeroPedido"
                .Connection = sqlConn
            End With
            'Define e inclui um parametro input a coleção de parametros
            param = sqlCmd.Parameters.Add(New SqlParameter("@NumeroPedido", SqlDbType.Int))
            'Defina direção do parametro
            param.Direction = ParameterDirection.Input
            'Pega o valor do parametro
            param.Value = NumericUpDown1.Value    'obtem o valor do número do pedido do controle
            'Abre a conexao
            sqlConn.Open()
            'Executa o comando e obtem o valor
            nomeDestinatario = sqlCmd.ExecuteScalar()
            'atribui o valor obtido a label do formulario
            lblDestinatario.Text = nomeDestinatario
        Catch ex As Exception
            ' trata a exceção
            MsgBox(ex.Message())
        Finally
            ' Fecha a conexao (este comando SEMPRE será executado.)
            sqlConn.Close()
        End Try
    End Sub

 

Abaixo temos o formulário exibindo o nome do destinatário para o número do pedido 10254.

2- Obtendo registros - Usando o objeto DataReader

Podemos obter o mesmo resultado usando o objeto DataReader. Ele pode retornar dados usando consultas SQL de forma rápida e sem muito overhead ; O conjunto de registros obtido e do tipo read-only e forward-only.

O código abaixo utiliza um DataReader e um procedimento armazenado chamado sp_DadosClientes para obter os dados de um pedido através da informação do seu número de pedido.

A stored procedure sp_DadosPedidos tem o seguinte código :

Nota: Para criar a SP abra o EnterPrise Manager e expanda a ramificação até o banco de dados que você esta usando, no meu caso TesteWin. A seguir clique com o botão direito do mouse sobre o item Stored Procedures e digite o código abaixo:

O código é o seguinte :

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim sqlConn As SQLConnection
        Dim sqlCmd As SQLCommand
        Dim sqlDataRdr As SqlDataReader
        Dim saida As String
        Try
            'Cria um novo objeto connecation
            sqlConn = New SqlConnection("Data Source=MACORATTI;" & _
                                        "Integrated Security=SSPI;Initial Catalog=TesteWind")
            'Cria um novo objeto command
            sqlCmd = New SqlCommand
            'Especifica a stored procedure e a conexao
            With sqlCmd
                'define o tipo de comando
                .CommandType = CommandType.Text
                'define o comando a ser ececutado
                .CommandText = "Exec sp_DadosPedidos @CodigoPedido=" & NumericUpDown1.Value
                .Connection = sqlConn
            End With
            sqlConn.Open()
            ' Execute o comando e retorna o registro no datareader
            sqlDataRdr = sqlCmd.ExecuteReader()
            ' posiciona o ponteiro no registro
            sqlDataRdr.Read()
            ' Obtem o valor do registgro
            saida = "Número do Pedido  : " & sqlDataRdr.Item("NúmeroDoPedido").ToString() & vbCrLf & _
                       "Código do Cliente : " & sqlDataRdr.Item("CódigoDoCliente").ToString() & vbCrLf & _
                       "Cidade Destino    : " & sqlDataRdr.Item("CidadeDeDestino").ToString() & vbCrLf & _
                       "País de destino   : " & sqlDataRdr.Item("PaísDeDestino").ToString()
            lblsaida.text = saida
        Catch ex As Exception
            ' trata a exceção
            MsgBox(ex.Message())
        Finally
            'fecha o datareader
            sqlDataRdr.Close()
            ' Fecha a conexao
            sqlConn.Close()
        End Try
    End Sub

Executando o projeto acima usando um formulário com um botão de comando , uma label e o controle NumericUPDown temos o seguinte :

3- Obtendo registros - Usando o objeto DataSet

O objeto DataSet fornece o acesso desconectado aos dados. Usando DatSet , SQL e os provedores gerenciados podemos ler e escrever em dados na fonte de dados. Mesmo que desejamos retornar apenas um único registro o DataSet deve ser considerado pois oferece um conjunto de métodos para realizar esta tarefa.

O objeto DataAdapter funciona como uma camada de mapeamento entre a fonte de dados e o DataSet. Ele retorna dados da fonte de dados , preenche o DataSet e envia as alterações de volta a fonte de dados.

No exemplo abaixo estou usando um DataSet para obter dados da tabela Pedidos do banco de dados TesteWind.  Informando o número do pedido , estou usando a mesma stored procedure do exemplo anterior : sp_DadosPedidos para retornar o nome da cidade de destino do pedido.

    Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim ds As DataSet
        Dim da As SqlDataAdapter
        Try
            ' Cria um novo DataAdapter
            da = New SqlDataAdapter
            ' Cria um novo DataSet
            ds = New DataSet
            With da
                ' inclui um objeto SelectCommand
                .SelectCommand = New SqlCommand
                ' Define o commando Select
                With .SelectCommand
                    'define o tipo de comando
                    .CommandType = CommandType.Text
                    'define o comando a ser ececutado
                    .CommandText = "Exec sp_DadosPedidos @CodigoPedido=" & NumericUpDown1.Value
                    .Connection = New SqlConnection("Data Source=MACORATTI;" & _
                                        "Integrated Security=SSPI;Initial Catalog=TesteWind")
                End With
                ' Preenche o dataset com os dados
                .Fill(ds, "Pedidos")
            End With
            ' exibe o dado na label
            lblsaida.Text =  ds.Tables("Pedidos").Rows(0).Item("CidadeDeDestino").ToString()
        Catch ex As Exception
            ' trata a exceção
            MsgBox(ex.Message())
        End Try
    End Sub

 

O resultado é exibido na figura abaixo:

4- Obtendo registros - Usando o XMlReader

O SQL Server 2000 suporta XML nativamente. Sabendo disto podemos usar este recurso para obter registros de uma fonte de dados. O resultado de uma declaração SELECT pode ser retornado como XML pelo uso da cláusula FOR XML.

Para retornar XML diretamente do SQL Server podemos usar o método ExecuteXmlReader do objeto SQLCommand. Este método retorna um objeto System.Xml.XmlReader contendo o XML retornado pelo SQL Server.

No exemplo abaixo estou fazendo isto usando este recurso:

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

        Dim sqlConn As SQLConnection
        Dim sqlCmd As SQLCommand
        Dim xmlRdr As Xml.XmlReader
        Try
            'Cria um novo objeto connection
            sqlConn = New SqlConnection("Data Source=MACORATTI;" & _
                                        "Integrated Security=SSPI;Initial Catalog=TesteWind")
            'Cria um novo objeto command
            sqlCmd = New SqlCommand
            'Especifica a stored procedure e a conexao
            With sqlCmd
                'define o tipo de comando
                .CommandType = CommandType.Text
                'define o comando a ser ececutado
                .CommandText = "Select * from Pedidos Where NúmeroDoPedido = " & NumericUpDown1.Value & " For XML Auto"
                .Connection = sqlConn
            End With
            sqlConn.Open()
            ' Execute o comando e retorna o registro no datareader
            xmlRdr = sqlCmd.ExecuteXmlReader()
            ' move para o elemento raiz
            xmlRdr.MoveToContent()
            ' Obtem o valor do registro
            lblsaida.Text = xmlRdr.ReadOuterXml
        Catch ex As Exception
            ' trata a exceção
            MsgBox(ex.Message())
        Finally
            ' Fecha a conexao
            sqlConn.Close()
        End Try
    End Sub

O resultado do código acima é mostrado a seguir:

Observe que obtemos a tag XML para o número do pedido indicado no formulário.

Veja também o artigo : VB.NET - Operações com dados que não retornam registros

Até a próxima...

João 6:14 Vendo, pois, aqueles homens o sinal que Jesus operara, diziam: este é verdadeiramente o profeta que havia de vir ao mundo.

    João 6:15 Percebendo, pois, Jesus que estavam prestes a vir e levá-lo à força para o fazerem rei, tornou a retirar-se para o monte, ele sozinho.
 

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti