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: