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








