Dev (Back & Front)ARTIGO

C# – Acessando e obtendo dados com DataReader

Este artigo mostra como
acessar um banco de dados e exibir as informações das tabelas
usando ADO .NET, mais especificamente a classe DataReader.

A classe DataReader fornece
funções similares aos cursores SQL, os quais não são
atualmente suportados na plataforma .NET. Dessa forma ela é
usada para retornar um fluxo de dados e somente-para-frente e
somente-leitura de uma fonte de dados de forma muito eficiente.

Os DataReaders são
apropriados quando você precisa simplesmente exibir o resultado
de uma consulta em cenários em que as informações não precisam
ser atualizadas nem persistidas através de múltiplas
requisições.

A classe DataReader é um
componente ADO .NET que possui diversos componentes para acesso e
manipulação de dados e que possui dois componentes principais:

  • DataSet
    – o principal componente da arquitetura desconectada ADO
    .NET usado para acesso independente da fonte de dados;
  • .NET Data
    Provider
    – inclui os objetos Connection, Command, DataReader e DataAdapter.

A seguir temos uma figura
mostrando os componentes da arquitetura ADO .NET:

Neste exemplo eu vou
acessar o banco de dados Northwind.mdf do banco de dados SQL
Server e exibir informações em um projeto Windows Forms usando
a linguagem C#.

Este é um artigo para
iniciantes e aborda o acesso a dados, a utilização da classe
DataReader em um projeto Windows Forms.

Para criar o projeto deste
artigo, eu vou usar o Visual C# 2010 Express Edition.

Abra o Visual C# 2010
Express e crie um novo
projeto do tipo Windows Forms Application com o nome acesso_DataReader.

No exemplo deste artigo,
vamos criar uma interface que permite que usuários efetuem
consultas na tabela Products do banco de dados Northwind usando
uma consulta com parâmetros e a classe DataReader.

Vamos definir a interface
com o usuário no formulário form1.vb conforme
o leiaute da figura abaixo:

Os componentes usados a
partir da ToolBox foram:

  • 1
    TextBox – txtProduto;
  • 1
    Button –
    btnLocalizar;
  • 1 listBox – lbProdutos.

O projeto vai funcionar
assim:

  1. O usuário informa na
    caixa de texto o nome completo ou parcial de um produto
    que deseja localizar e clica no botão para localizar;
  2. O código executa uma
    consulta SQL usando parâmetros e obtém um DataReader
    com as informações exibindo-as no ListBox.

A seguir, temos a imagem
mostrando a tela principal do programa exibindo informações dos
produtos da tabela Products do banco de dados Northwind.mdf:

Observe que basta o
usuário digitar um caractere para que produtos iniciados pelo
caractere sejam exibidos e que também exibidos o total de
produtos localizados para a consulta.

Vejamos como podemos
implementar o código para realizar tal tarefa.

Iniciamos definindo os namespaces
usados no projeto:

  • using System;
  • using System.ComponentModel;
  • using System.Data;
  • using System.Windows.Forms;
  • using System.Data.SqlClient;
  • using System.Configuration.

Os namespaces System.Data e
System.Data.SqlClient nos dão acesso às classes de acesso a
dados usadas no projeto : SqlConnection, SqlCommand,
SqlDataReader e a propriedade ConnectionState;

O namespace Configuration permite
usarmos a classe ConfigurationManager para obter
a string de conexão do arquivo App.Config que é exibido abaixo:

<br /><br /><br /><br /><br /><strong>      <br /><br />connectionString="Data<br />Source=.\SQLEXPRESS;AttachDbFilename=C:\dados\NORTHWND.MDF;Integrated<br />Security=True;Connect Timeout=30;User Instance=True"<br />            providerName="System.Data.SqlClient" /><br /><br /><</strong>/configuration>

Além de definir o namespace, devemos
incluir uma referência no projeto a System.Configuration. Para
isso, clique com o botão direito do mouse sobre o nome do projeto
e selecione Add Reference.

Em seguida, selecione na aba .NET a
opção System.Configuration e clique em Ok.

Agora vamos definir as variáveis
objeto usadas no projeto declarando-as logo após no início do
formulário form1::

  • SqlDataReader rdr =
    null;
  • SqlConnection con = null;
  • SqlCommand cmd = null.

Crie a rotina getConexaoBD no formulário form1
que vai obter a string de conexão do arquivo App.Config
usando a classe ConfigurationManager, criar uma nova conexão e
retorna a conexão criada:

 private SqlConnection getConexaoBD()<br /> {<br />     //obtem a string de conexão do App.Config e retorna uma nova conexao<br /><br />string strConexao =<br />ConfigurationManager.ConnectionStrings["acesso_DataReader.Properties.Settings.NORTHWNDConnectionString"].ConnectionString;<br />     return new SqlConnection(strConexao);<br /> }

No evento Click do
botão para localizar produtos, ao lado da caixa de texto,
defina o seguinte código:

      private void btnLocalizar_Click(object sender, EventArgs e)<br />        {<br />            try<br />            {<br />                con = getConexaoBD();<br />                con.Open();<br /><br />                // define o command com a consulta dada e associa a conexão<br />                string sql = "SELECT ProductID, ProductName, UnitPrice" +<br />                                  " FROM Products" +<br />                                  " WHERE (ProductName LIKE @nomeProduto)" +<br />                                  " ORDER BY ProductID";<br /><br />                cmd = new SqlCommand(sql);<br />                cmd.Connection = con;<br /><br />                // define o parâmetro<br />                cmd.Parameters.Add(new SqlParameter(<br />                       "@nomeProduto",                            // o nome do produto <br />                       System.Data.SqlDbType.NVarChar, // o tipo do parametro<br />                       20,                                                  // o tamanho do parametro<br />                       "ProductName"));                           // o nome da coluna<br /><br />                // Preenche o parametro com o valor obtido do campo texto<br />                cmd.Parameters["@nomeProduto"].Value = txtProduto.Text + "%";<br /><br />                // Executa a cosulta<br />                rdr = cmd.ExecuteReader();<br />                // limpa o listbox<br />                lbProdutos.Items.Clear();<br />                //define o total de registros como zero<br />                int nuReg = 0;<br />                //percorre o leitor e exibe os valores no listbox<br />                while (rdr.Read())<br />                {<br />                    lbProdutos.Items.Add(rdr["ProductID"].ToString() +<br />                    " - " + rdr["ProductName"].ToString() + " - " + rdr["UnitPrice"].ToString());<br />                    nuReg++;<br />                }<br />                //exibe o total de registros obtidos<br />                lbltotal.Text = nuReg.ToString() + " Produtos";<br /><br />            }<br />            catch (Exception ex)<br />            {<br />                // mensagem de erro<br />                MessageBox.Show(ex.Message);<br />            }<br />            finally<br />            {<br />                // fecha os objetos datareader e connection<br />                if (rdr != null)<br />                    rdr.Close();<br /><br />                if (con.State == ConnectionState.Open)<br />                    con.Close();<br />            }<br />        }

Vamos entender o código usado:

01. Obtemos uma nova conexão usando a função getConexaoBD() e a
abrimos:

   con = getConexaoBD();<br />                con.Open();

02. Definimos uma instrução SQL para retornar o
código, nome e preço do produto, onde o nome do produto deverá ser igual ao nome
informado pelo usuário. Aqui criarmos uma consulta parametrizada onde o
parâmetro foi definido como @nomeProduto. Note o sinal @ no início do nome.

A

é referência em Visual Basic no Brasil e autor dos livros "Aprenda Rápido: ASP" e "ASP, ADO e Banco de Dados na Internet". Mantenedor do site macoratti.net.

Ver perfil