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: