C# - Localizando registros(linhas) com ADO .NET


O que é  ADO .NET ?

ADO .NET é a nova tecnologia para acesso a dados da plataforma .NET estando integrada ao  .NET Framework e oferecendo diversas classes que permitem realizar praticamente todas as tarefas relacionadas com o acesso e manutenção de dados.

ADO .NET oferece suporte a uma variedade de opções para desenvolvimento de soluções com acesso a dados que permitem a comunicação com qualquer fonte de dados, desde os já conhecidos gerenciadores de banco de dados relacionais (SGBD) como : SQL Server, MySQL, FireBird, Oracle, Sybase, Access, XML, arquivos textos, etc.

Os componentes considerados os pilares da ADO.NET são  o DataSet e os provedores .NET que são um conjunto de componentes que incluem os objetos :

Através da  ADO.NET podemos acessar dados de três maneiras básicas: OLE DB , SQL e ODBC.

Para detalhes veja o meu mini-curso sobre ADO .NET em : ADO.NET - Uma visão geral : Objetos Connection - Macoratti.net

No artigo de hoje eu vou falar sobre como podemos localizar registros com ADO .NET.

A ADO .NET implementa 3 formas básicas de localizar registros ou linhas:

- Os métodos Find e Contains da classe DataRowCollection

A classe DataRowCollection representa uma coleção de linhas em um objeto DataTable e contém os dados atuais de uma tabela onde cada DataRow existente na DataRowCollection representa uma única linha ou registro da tabela.

Podemos chamar os métodos Add e Remove para inserir e deletar objetos DataRow a partir da classe DataRowCollection; podemos também chamar o método Find para procurar por um objeto DataRow que contenha um valor específico na chave primária, e podemos ainda chamar o método Contains para procurar por dados que coincidam com caracteres ou frases;

- Os métodos Find e FindRows do objeto DataView

Outro recurso existente é usar os métodos Find ou FindRows do objeto DataView para procurar por linhas de acordo com seus valores chaves de ordenação. A busca sensitiva de valores através desses métodos é determinada pela propriedade CaseSensitive do objeto DataTable correspondente. Os valores procurados precisam coincidir com os valores das chaves de ordenação completamente para que possam retornam um resultado.

O método Find da coleção Rows

De forma similar ao método Select do objeto DataTable, o método Find da coleção Rows retorna um objeto DataRow, e, neste caso, uma única linha e não um array de linhas. Este método precisa que você defina a propriedade chave primária (Primary Key) antes de usá-lo. Se você não fizer isso vai obter uma exceção.

- Definindo a propriedade PrimaryKey

Quando você usa uma consulta que executa uma stored procedure a ADO .NET não define a chave primária para você o que significa que você tem que fazer isso você mesmo manualmente. Vejamos um exemplo de definição de chave primária via código:

// Definindo a Chave Primária quando existem duas colunas na chave primária
DataColumn[] colPk = new DataColumn[2];
colPk[0] = dsOrderItem.Tables[0].Columns["CustomerID"];
colPk[1] = dsOrderItem.Tables[0].Columns["OrderID"];
dsOrderItem.Tables[0].PrimaryKey = colPk;

Depois de definir a chave primária, podemos usar o método Find da coleção Rows sem problemas. No exemplo a seguir define e executa o método Find contra uma coleção de linhas onde é retornado um objeto DataRow baseado na chave primária passada como argumento.

Para o exemplo usado a seguir eu vou usar o Visual C# 2010 Express Edition e o banco de dados Northwind.mdf do SQL Server 2005.

Abra o Visual C# 2010 Express Edition e crie um novo projeto do tipo Windows Forms Application com o nome ADONET_Find;

No formulário padrão form1.cs inclua um controle DataGridView - gdvOrders , um controle Button - btnLocalizar e 7 controles TextBox conforme o leiaute abaixo:

Antes de começar a definir o código do formulário vou comentar alguns detalhes que precisamos entender.

O botão Localizar Pedido permite localizar um registro na tabela e exibir no formulário. Estamos realizando a busca usando o InputBox e para isso devemos incluir uma referência no projeto a Microsoft.VisualBasic;

No menu Project clique em Add Reference e na janela Add Reference selecione a aba .NET e escolha o item Microsoft.VisualBasic e clique em OK;

Após isso defina o namespace no código do projeto: using Microsoft.VisualBasic

Inclua também um namespace para podermos acessar o banco de dados Northwind.mdf do SQL Server: System.Data.SqlClient;

Feito isso vamos definir a string de conexão com o banco de dados Northwind.mdf. No meu exemplo a string de conexão será a seguinte:

//define a string e conexão
string strCon = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\dados\NORTHWND.MDF;Integrated Security=True;Connect Timeout=30;User Instance=True";

Obs: No seu caso a string pode ser diferente.

Após isso vamos definir no início do formulário as variáveis:

SqlDataAdapter da;
DataSet ds;

Agora vamos definir no evento Load o código que vai acessar o banco de dados Northwind e obter os dados da tabela Orders:

    private void Form1_Load(object sender, EventArgs e)
    {
            //define a string e conexão
            string strCon = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\dados\NORTHWND.MDF;Integrated Security=True;Connect Timeout=30;User Instance=True";
            // preenche a tabela Orders
            da = new SqlDataAdapter("SELECT * FROM Orders",strCon);
            //preenche um dataset e exibe no grid
            SqlCommandBuilder MyCmd = new SqlCommandBuilder(da);
            ds = new DataSet();
            da.Fill(ds);
            gdvOrders.DataSource = ds.Tables[0].DefaultView;

  }

No evento Click do botão de comando temos o código que irá definir a chave primária e usar o método Find da coleção Rows para localizar um registro pela chave primária definida. No caso estamos usando o campo OrderId como chave primária.

     private void btnLocalizar_Click(object sender, EventArgs e)
        {
            //definindo a chave primária
            DataColumn[] chave = new DataColumn[1];
            chave[0] = ds.Tables[0].Columns[0];
            ds.Tables[0].PrimaryKey = chave;

            //abrindo o inputbox para pedir o número do pedido
            int n = Convert.ToInt32(Interaction.InputBox("Informe o número do pedido:", "Procurar", "1", 450, 400));

            //defina um DataRow
            DataRow linha;

            //usar o método Find para localizar a linha pelo número informado
            linha = ds.Tables[0].Rows.Find(n);

            //exibe os valores no formulário
            if (linha != null)
            {
                txtPedido.Text = linha[0].ToString();
                txtCustomerID.Text = linha[1].ToString();
                txtEmployeeID.Text = linha[2].ToString();
                txtOrderDate.Text = linha[3].ToString();
                txtShippedDate.Text = linha[4].ToString();
                txtShipAddress.Text = linha[9].ToString();
                txtShipCity.Text = linha[10].ToString();
            }
            else
                MessageBox.Show("Registro não localizado.");
        }

Executando o projeto e clicando no botão de comando a caixa de diálogo irá surgir solicitando o número do pedido;

Após informar o número do pedido e clicar em OK o método Find irá localizar o pedido e exibir o registro no formulário conforme figura a seguir:

Este é uma das formas que temos para localizar registros usando ADO .NET.

Aguarde o próximo artigo onde irei abordar o método Contains.

Pegue o projeto completo aqui: ADONET_Find.zip

Simples, simples assim...

Referências:


José Carlos Macoratti