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

2.vb conforme o leiaute da figura abaixo: Os componentes usados a partir da ToolBox foram: • • • 1 TextBox . a utilização da classe DataReader em um projeto Windows Forms.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#. 1 Button . Para criar o projeto deste artigo eu vou usar o Visual C# 2010 Express Edition (ele é gratuito).txtProduto. . 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. 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. 1 listBox .lbProdutos O projeto vai funcionar assim: 1. O código executa uma consulta SQL usando parâmetros e obtém um DataReader com as informações exibindo-as no ListBox.btnLocalizar. Vamos definir a interface com o usuário no formulário form1. Abra o Visual C# 2010 Express e crie um novo projeto do tipo Windows Forms Application com o nome acesso_DataReader. Este é um artigo para iniciantes e aborda o acesso a dados.

Configuration.A seguir temos a imagem mostrando a tela principal do programa exibindo informações dos produtos da tabela Products do banco de dados Northwind. System. Vejamos como podemos implementar o código para realizar tal tarefa. System. SqlCommand.Data e System.Windows. System. 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.Config que é exibido abaixo: <?xml version="1.Data.SqlClient.Data.0" encoding="utf-8" ?> <configuration> <configSections> . O namespace Configuration permite usarmos a classe ConfigurationManager para obter a string de conexão do arquivo App. Iniciamos definindo os namespaces usados no projeto: using using using using using using System.mdf.ComponentModel. SqlDataReader e a propriedade ConnectionState.SqlClient nos dão acesso as classes de acesso a dados usadas no projeto : SqlConnection.Data. System. Os namespaces System. System.Forms.

criar uma nova conexão e retorna a conexão criada: .Configuration para isso clique com o botão direito do mouse sobre o nome do projeto e selecione Add Reference.NORTHWNDConnectionString" connectionString="Data Source=.Configuration e clique Ok.Settings.Data.Properties.MDF.SqlClient" /> </connectionStrings> </configuration> Além de definir o namespace devemos incluir uma referência no projeto a System.</configSections> <connectionStrings> <add name="acesso_DataReader.\SQLEXPRESS.User Instance=True" providerName="System. Em seguida selecione na aba .Connect Timeout=30. SqlCommand cmd = null.AttachDbFilename=C:\dados\NORTHWND.Integrated Security=True. 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. Crie a rotina getConexaoBD no formulário form1 que vai obter a string de conexão do arquivo App.NET a opção System.Config usando a classe ConfigurationManager. SqlConnection con = null.

ConnectionStrings["acesso_DataReader.Text + "%". return new SqlConnection(strConexao).Open(). // o tamanho do parametro "ProductName")).Text = nuReg.Read()) { lbProdutos.Value = txtProduto.ConnectionString.Settings." + rdr["ProductName"]. } No evento Click do botão para localizar produtos . UnitPrice" + " FROM Products" + " WHERE (ProductName LIKE @nomeProduto)" + " ORDER BY ProductID".ToString()).NVarChar.Properties.NORTHWNDCo nnectionString"].Add(rdr["ProductID"].Parameters["@nomeProduto"]." + rdr["UnitPrice"].Add(new SqlParameter( "@nomeProduto". } //exibe o total de registros obtidos lbltotal. cmd = new SqlCommand(sql).Clear(). //percorre o leitor e exibe os valores no listbox while (rdr. // o nome do produto System. // limpa o listbox lbProdutos. // define o parâmetro cmd.Connection = con.ExecuteReader(). //define o total de registros como zero int nuReg = 0.Data. defina o seguinte código: private void btnLocalizar_Click(object sender.Parameters.Config e retorna uma nova conexao string strConexao = ConfigurationManager.ToString() + " . cmd.Items. nuReg++. // o nome da coluna // Preenche o parametro com o valor obtido do campo texto cmd. ao lado da caixa de texto.SqlDbType.ToString() + " Produtos". ProductName. // define o command com a consulta dada e associa a conexão string sql = "SELECT ProductID.ToString() + " . } catch (Exception ex) { // mensagem de erro . // o tipo do parametro 20.private SqlConnection getConexaoBD() { //obtem a string de conexão do App. // Executa a cosulta rdr = cmd. con. EventArgs e) { try { con = getConexaoBD().Items.

A cláusula LIKE permite efetuar uma consulta irrestrita: Usando a cláusula LIKE As vezes os dados que você está desejando filtrar não têm uma ocorrência exata. } finally { // fecha os objetos datareader e connection if (rdr != null) rdr.Show(ex. ProductName. Note que usamos o sinal de porcentagem (%) que funciona como um coringa . Josué.Close(). Aqui criarmos uma consulta parametrizada onde o parâmetro foi definido como @nomeProduto. etc.Open) con. nome e preço do produto onde o nome do produto deverá ser igual ao nome informado pelo usuário. Josias. A seguir listamos abaixo as principais ocorrências : Tipo de ocorrência Padrão utilizado na Consulta SQL O retorno da Pesquisa Múltiplos caracteres bb. UnitPrice" + " FROM Products" + . ou você pretende realizar uma busca mais irres usar a cláusula LIKE.Close().. con.Obtemos uma nova conexão usando a função getConexaoBD() e a abrimos: con = getConexaoBD().Open().Definimos uma instrução SQL para retornar o código. if (con. 2.Message). substituindo os demais caracteres. Através da inserir as letras desejadas e a SQL fará uma busca parcial pela string informada: Algo como: SELECT nome FROM tblalunos WHERE nome LIKE "Jos%" Isto retornará os possíveis nomes: José . Note o sinal @ no início do nome. abc // define o command com a consulta dada e associa a conexão string sql = "SELECT ProductID. bccccB b%b Caractere especial Múltiplos caracteres b[%]b ab% b%b abcdefg. } } Vamos entender o código usado: 1.MessageBox.. bBb. Supondo que desejamos filtrar todos os alunos que tenham o nome começado pelas letrar Jos.State == ConnectionState. Josimar.

3. //define o total de registros como zero int nuReg = 0.NVarChar." WHERE (ProductName LIKE @nomeProduto)" + " ORDER BY ProductID". // o tipo de dados do parametro 20. seu nome. Definimos um objeto Command para a instrução sql definida e especificamos a conexão onde o comando será usado.Executamos a consulta obtendo um DataReader (rdr). // limpa o listbox lbProdutos. cmd = new SqlCommand(sql).ExecuteReader(). 4.Value = txtProduto. // o tamanho do parametro "ProductName")).Data.Items.SqlDbType.Definimos o parâmetro a ser usado . // o nome do produto System.Connection = con. // o nome da coluna // Preenche o parametro com o valor obtido do campo texto cmd.Read()) { . tipo de dados.Parameters.Parameters["@nomeProduto"]. e preenchemos o controle ListBox com as informações obtidas: // Executa a cosulta rdr = cmd.Clear(). cmd.Add(new SqlParameter( "@nomeProduto". tamanho e nome da coluna sobre o qual irá atual e incluímos na coleção Parameters: // define o parâmetro cmd. //percorre o leitor e exibe os valores no listbox while (rdr.Text + "%" Ao definir o valor do parâmetro obtemos o valor informado na caixa de texto txtProduto e acrescentamos o curinga '%' a final do texto digitado para ser usado com a cláusula LIKE que já explicamos acima.

Para melhorar o código sugiro que você crie uma camada e remova o código de acesso a dados do formulário usando as boas práticas.Add(rdr["ProductID"].. simples assim.ADO . Pegue o projeto completo aqui: Eu sei é apenas C#. Observe que essa consulta pode ser desatualizada quando que terminar de ler os dados." + rdr["UnitPrice"].ToString())..ToString() + " ..DataReader C# .ToString() + " . nao existe nenhuma propriedade RecordCount para indicar quantos registros estão sendo obtidos O objeto DataReader ou a fonte de dados geralmente sabe quantos registros estão sendo obtidos até que o último registro seja enviado para o cliente. use um dos seguintes métodos: • • Conte os registros enquanto você percorrer o leitor. Quando você usa a classe SqlDataReader ou OleDbDataReader ." + rdr["ProductName"]. nuReg++. Execute uma consulta SELECT COUNT(*) primeiro.Text = nuReg. Dessa forma cumprimos nosso objetivo e obtemos os registros desejados usando um DataReader. C# . } //exibe o total de registros obtidos lbltotal.Items.Preenchendo um DataGridView SQL .lbProdutos.ToString() + " Produtos". Simples..zip C# . Referências: • • • • acesso_DataReader. Para obter o total de registros tivemos que usar um artifício. Para contornar este problema. mas eu gosto.NET para iniciantes .Selecionando dados com SQL Seção C# do site .

Sign up to vote on this title
UsefulNot useful