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:

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

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

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

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

bccccB b%b Caractere especial Múltiplos caracteres b[%]b ab% b%b abcdefg.State == ConnectionState. ProductName.MessageBox. Josimar.Open) con. Josué.Close().. 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é .Close(). 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. Note que usamos o sinal de porcentagem (%) que funciona como um coringa . nome e preço do produto onde o nome do produto deverá ser igual ao nome informado pelo usuário. ou você pretende realizar uma busca mais irres usar a cláusula LIKE. con. substituindo os demais caracteres. Josias.. if (con. 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. abc // define o command com a consulta dada e associa a conexão string sql = "SELECT ProductID. UnitPrice" + " FROM Products" + .Show(ex. Note o sinal @ no início do nome. 2. } } Vamos entender o código usado: 1.Obtemos uma nova conexão usando a função getConexaoBD() e a abrimos: con = getConexaoBD(). Aqui criarmos uma consulta parametrizada onde o parâmetro foi definido como @nomeProduto. etc.Message). Supondo que desejamos filtrar todos os alunos que tenham o nome começado pelas letrar Jos.Open().Definimos uma instrução SQL para retornar o código. } finally { // fecha os objetos datareader e connection if (rdr != null) rdr. bBb.

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

lbProdutos.Selecionando dados com SQL Seção C# do site .Items.ADO .Add(rdr["ProductID"].zip C# .. Pegue o projeto completo aqui: Eu sei é apenas C#. nuReg++. use um dos seguintes métodos: • • Conte os registros enquanto você percorrer o leitor. simples assim. Execute uma consulta SELECT COUNT(*) primeiro.. Simples. Quando você usa a classe SqlDataReader ou OleDbDataReader .Text = nuReg. mas eu gosto. Para obter o total de registros tivemos que usar um artifício. Para contornar este problema. Dessa forma cumprimos nosso objetivo e obtemos os registros desejados usando um DataReader.." + rdr["ProductName"]. } //exibe o total de registros obtidos lbltotal.ToString() + " ." + rdr["UnitPrice"]. 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. Referências: • • • • acesso_DataReader..DataReader C# . Observe que essa consulta pode ser desatualizada quando que terminar de ler os dados.NET para iniciantes . C# .ToString() + " Produtos".Preenchendo um DataGridView SQL .ToString() + " . 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.ToString()).

Sign up to vote on this title
UsefulNot useful