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:
connectionString="Data
Source=.\SQLEXPRESS;AttachDbFilename=C:\dados\NORTHWND.MDF;Integrated
Security=True;Connect Timeout=30;User Instance=True"
providerName="System.Data.SqlClient" />
</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()
{
//obtem a string de conexão do App.Config e retorna uma nova conexao
string strConexao =
ConfigurationManager.ConnectionStrings["acesso_DataReader.Properties.Settings.NORTHWNDConnectionString"].ConnectionString;
return new SqlConnection(strConexao);
}
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)
{
try
{
con = getConexaoBD();
con.Open();
// define o command com a consulta dada e associa a conexão
string sql = "SELECT ProductID, ProductName, UnitPrice" +
" FROM Products" +
" WHERE (ProductName LIKE @nomeProduto)" +
" ORDER BY ProductID";
cmd = new SqlCommand(sql);
cmd.Connection = con;
// define o parâmetro
cmd.Parameters.Add(new SqlParameter(
"@nomeProduto", // o nome do produto
System.Data.SqlDbType.NVarChar, // o tipo do parametro
20, // o tamanho do parametro
"ProductName")); // o nome da coluna
// Preenche o parametro com o valor obtido do campo texto
cmd.Parameters["@nomeProduto"].Value = txtProduto.Text + "%";
// Executa a cosulta
rdr = cmd.ExecuteReader();
// limpa o listbox
lbProdutos.Items.Clear();
//define o total de registros como zero
int nuReg = 0;
//percorre o leitor e exibe os valores no listbox
while (rdr.Read())
{
lbProdutos.Items.Add(rdr["ProductID"].ToString() +
" - " + rdr["ProductName"].ToString() + " - " + rdr["UnitPrice"].ToString());
nuReg++;
}
//exibe o total de registros obtidos
lbltotal.Text = nuReg.ToString() + " Produtos";
}
catch (Exception ex)
{
// mensagem de erro
MessageBox.Show(ex.Message);
}
finally
{
// fecha os objetos datareader e connection
if (rdr != null)
rdr.Close();
if (con.State == ConnectionState.Open)
con.Close();
}
}
Vamos entender o código usado:
01. Obtemos uma nova conexão usando a função getConexaoBD() e a
abrimos:
con = getConexaoBD();
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