No artigo de hoje vou escrever um pouco sobre a classe DataTable, que representa uma tabela de dados na memória, mostrando como realizar as operações mais usadas com esse recurso na linguagem C#.
Um DataTable é como um container que podemos usar para armazenar informações de praticamente qualquer fonte de dados, sendo composto por uma coleção de linhas (rows) e colunas (columns). Podemos criar um DataTable para armazenar dados em memória e realizar operações para incluir, alterar e excluir essas informações.
O DataTable é também um objeto central na biblioteca ADO.NET. Outros objetos que usam o DataTable incluem o DataSet e o DataView.
Podemos criar objetos DataTable via código adicionando linhas e colunas de acordo com nossa necessidade.
A classe DataTable está presente no namespace System.Data.
Neste artigo, vou mostrar como realizar as seguintes operações com a classe DataTable:
- Como criar um DataTable via código
- Como adicionar dados em um DataTable
- Como selecionar dados a partir de um DataTable
- Como selecionar dados a partir de um DataTable via LINQ
- Como percorrer um DataTable
- Como converter um DataTable para XML
- Como converter XML para DataTable
- Como Converter um List para DataTable
Recursos usados: Visual Studio 2013 Express for Windows Desktop
Criando o projeto no VS 2013 Express Edition
Abra o VS 2013 Express for Windows desktop e clique em New Project. A seguir, selecione Visual C# -> Windows Forms Application.
Informe o nome Usando_DataTable e clique no botão OK.
A seguir, incluir no arquivo form1.cs os seguintes controles a partir da Toolbox:
-
1 DataGridView – dgvDados
-
1 ListBox – lbDados
-
1 Combobox – cboCampo
-
1 TextBox – txtCriterio
-
8 Buttons – btnCriarDataTable, btnSelecionarDados, btnConsultaLINQ, btnConsultaLINQ_2, ConsultaLINQ_ExpressaoLambda,
btnDataTable_XML, btnXML_DataTable e btnList_DataTable
O leiaute da aplicação deverá está conforme a figura abaixo:
No evento Click de cada botão de comando, vamos implementar a respectiva funcionalidade.
Namespaces usado no formulário:
using System; using System.Collections; using System.Data; using System.Windows.Forms.
Definição das variáveis dtb_Alunos e txtCaminhoArquivo no início do formulário:
DataTable dtb_Alunos; string txtCaminhoArquivo = @"c:\dados\DataTable_XML.xml";
Criar e exibir Datatable
private void btnCriarDataTable_Click(object sender, EventArgs e) { DataTable tabela = CriarDataTable(); dgvDados.DataSource = tabela; }
O código do método CriarDataTable() é mostrado a seguir:
private DataTable CriarDataTable() { dtb_Alunos = new DataTable(); dtb_Alunos.Columns.Add("AlunoId", typeof(int)); dtb_Alunos.Columns.Add("Nome", typeof(string)); dtb_Alunos.Columns.Add("Email", typeof(string)); dtb_Alunos.Columns.Add("Telefone", typeof(string)); dtb_Alunos.Columns.Add("Idade", typeof(int)); dtb_Alunos.Rows.Add(1, "Macoratti", "macoratti@yahoo.com", "44669922", 45); dtb_Alunos.Rows.Add(2, "Jefferson", "jeff@bol.com.br", "88669977", 23); dtb_Alunos.Rows.Add(3, "Janice", "janjan@uol.com.br", "96885522", 20); dtb_Alunos.Rows.Add(4, "Jessica", "jessicalang@uol.com.br", "96885522", 25); dtb_Alunos.Rows.Add(5, "Miriam", "mimi@uol.com.br", "96885522", 48); return dtb_Alunos; }
Neste código estamos criando um DataTable chamado dtb_Alunos com cinco colunas e a seguir adicionamos cinco linhas referente a dados de alunos: AlunoId, Nome, E-mail, Telefone e Idade.
Selecionar dados
private void btnSelecionarDados_Click(object sender, EventArgs e) { string AlunoId =""; string Nome=""; string Email=""; string Telefone = ""; string Idade=""; string campo = cboCampo.Text; string criterio = txtCriterio.Text; string comando; if (campo == "AlunoId" || campo == "Idade") { comando = campo + "=" + criterio; } else { comando = campo + "=" + "'" + criterio + "'"; } DataRow[] oDataRow = dtb_Alunos.Select(comando); foreach (DataRow dr in oDataRow) { //usei 3 sintaxes diferentes para obter os valores AlunoId = dr[0].ToString(); Nome = dr["Nome"].ToString(); Email = dr[2].ToString(); Telefone = dr[3].ToString(); Idade = dr.Field<int>(4).ToString(); } lblSelecao.Text = AlunoId + " " + Nome + " " + Email + " " + Telefone + " " + Idade; }
O código acima cria cinco variáveis do tipo string para receber as informações da tabela dtb_Alunos.
A seguir, montamos uma consulta composta pelo nome do campo definido na combobox – cboCampo e pelo critério definido na caixa de textotxtCriterio.
Após montar a consulta na variável comando, usamos o método Select para selecionar a linha com critério escolhido e usamos um laço foreach para percorrer o resultado e obter os dados.
Para exibir o resultado, concatenamos os valores em um controle Label – lblSelecao.
Consultar usando LINQ
private void btnConsultaLINQ_Click(object sender, EventArgs e) { //consulta usando LINQ IEnumerable consulta = from aluno in dtb_Alunos.AsEnumerable() select aluno; foreach (DataRow dr in consulta) { lbDados.Items.Add(dr.Field<int>("AlunoId") + " - " + dr.Field<string>("Nome")); } }
Para podermos realizar uma consulta LINQ em um DataTable, temos que usar o método DataTableExtensions.AsEnumerable() do namespace System.Data, que retorna um objeto IEnumerable<T>, onde o parâmetro genérico T é DataRow.
Isso é necessário pois não podemos consultar diretamente contra uma coleção de Rows de um DataTable, visto que DataRowCollection não implementa IEnumerable<T>.
Consulta LINQ (tipo anônimo)
private void btnConsultaLINQ_2_Click(object sender, EventArgs e) { var consulta = from p in dtb_Alunos.AsEnumerable() where p.Field<string>(cboCampo.Text) == txtCriterio.Text select new { nome = p.Field<string>("Nome"), idade = p.Field<int>("Idade"), fone = p.Field<string>("Telefone") }; lbDados.Items.Clear(); //exibe o tipo anônimo foreach (var aluno in consulta) { lbDados.Items.Add(aluno.nome + " " + aluno.idade + " " + aluno.fone); } }
Nesta consulta LINQ estamos criando um tipo anônimo (nome, idade e fone) com base em uma consulta montada com os valores selecionados nos controles cboCampo e txtCriterio.
Expressão Lambda
private void ConsultaLINQ_ExpressaoLambda_Click(object sender, EventArgs e) { var consulta = from aluno in dtb_Alunos.AsEnumerable() select aluno; IEnumerable alunos = consulta.Where(c => c.Field<string>("Nome").Contains("J")); lbDados.Items.Clear(); //Todos os nomes que contem "J" foreach (DataRow aluno in alunos) { lbDados.Items.Add(aluno.Field<string>("Nome")); } }
Nesta consulta LINQ, usamos uma expressão lambda para obter os nomes que contém a letra J.
DataTable => XML
private void btnDataTable_XML_Click(object sender, EventArgs e) { try { dtb_Alunos.TableName = "Alunos"; dtb_Alunos.WriteXml(txtCaminhoArquivo); MessageBox.Show("Arquivo XML gerado com sucesso"); System.Diagnostics.Process.Start(txtCaminhoArquivo); } catch(Exception ex) { MessageBox.Show("Erro : " + ex.Message); } }
Para gerar um XML a partir do Datatable usamos o método WriteXML() passando o caminho e nome do arquivo xml.
XML => DataTable
private void btnXML_DataTable_Click(object sender, EventArgs e) { try { dtb_Alunos.ReadXml(txtCaminhoArquivo); dgvDados.DataSource = dtb_Alunos; } catch (Exception ex) { MessageBox.Show("Erro : " + ex.Message); } }
Para converter de XML para DataTable apenas usamos o método ReadXml() informando o caminho e nome do arquivo xml.
List => DataTable
private void btnList_DataTable_Click(object sender, EventArgs e) { // Examplo de lista : seleções da copa américa List<string[]> oLista = new List<string[]>(); oLista.Add(new string[] { "Brasil", "Peru", "Venezuela" , "Colômbia" }); oLista.Add(new string[] { "Argentina", "Paraguai", "Uruguai", "Jamaica" }); oLista.Add(new string[] { "Chile", "Bolívia", "México", "Equador" }); // Converte para DataTable DataTable oDataTable = ConverteLista_DataTable(oLista); dgvDados.DataSource = oDataTable; }
O código acima cria uma lista de strings contendo as seleções da copa América. A seguir, chamamos o método ConverteLista_DataTable() passando a lista criada e exibimos o DataTable retornado no DataGridView.
O código do método ConverteLista_DataTable é dado a seguir:
private DataTable ConverteLista_DataTable(List<string[]> oLista) { // Nova tabela DataTable oDataTable = new DataTable(); // no maximo colunas int colunas = 0; foreach (var array in oLista) { if (array.Length > colunas) { colunas = array.Length; } } // Adiciona colunas for (int i = 0; i < colunas; i++) { oDataTable.Columns.Add(); } // Adiciona linhas foreach (var array in oLista) { oDataTable.Rows.Add(array); } return oDataTable; }
Executando o projeto e selecionando a guia HTML para XAML e colando um trecho de código HTML conforme abaixo:
Pegue o projeto completo aqui: Usando_Datatable.zip