Se você ainda usa o Visual Basic 5 ou 6 e ainda reluta em migrar
para a linguagem VB.NET, existe uma
longa lista de melhorias e facilidades de que eu poderia listar para
convencê-lo a migrar de linguagem.
O tratamento de arquivos
XML é uma delas. Se você já precisou tratar arquivos XML na
linguagem Visual Basic usando as versões anteriores ao VB.NET,
sabe que a coisa é um tanto
trabalhosa, se comparada com o arsenal de recursos que a
plataforma .NET oferece.
Para convencê-lo, vou
mostrar neste artigo como podemos criar e ordenar um banco de
dados no formato XML usando as classes DataTable, DataSet e DataRows da linguagem Visual Basic na versão do
VB.NET 2010
Express Edition e também na linguagem C# do Visual C# Express Edition.
Para começar, logo de cara,
o VB 5 ou 6 já saem perdendo, sendo que as versões que vou usar
são totalmente gratuitas e sem restrição alguma, enquanto que
uma cópia do VB5 ou VB6, se você achar para vender, vai ter que
pagar – e eu estou me referindo a cópias legais.
Nota: Se
você ainda não baixou o Visual Basic 2010 Express Edition,
clique aqui: VB 2010 Express Edition
O cenário é o
seguinte:
- Você precisa
armazenar as informações de código, nomes,
endereços, cidade, cep, e-mails, telefones dos clientes
no formato XML; - Você tem que
gerar esse banco de dados de clientes no formato XML; - Você precisa
cadastrar essas informações em uma aplicação
Windows Forms; - Você precisa
exibir os dados dos clientes cadastrados.
Para esse exemplo, iremos
criar um arquivo XML chamado clientes.xml na
pasta c:\dados com a seguinte estrutura:
<?xml version="1.0" standalone="yes" ?>
- <Clientes>
<Codigo></Codigo>
<Nome></Nome>
<Endereco></Endereco>
<Cidade></Cidade>
<Cep></Cep>
<Telefone></Telefone>
<Email></Email>
</Clientes>
Pois bem, vamos iniciar abrindo o VB 2010 Express Edition e criando um projeto do tipo Windows Application. No menu File, selecione New Project e. a seguir. o template Windows Forms Application com o nome criaDBXML.
Com a solução criada, vamos incluir no formulário form1.vb criado por padrão os seguintes controles para criar a interface com o usuário:
- 7 Label: (adotar o nome padrão : Label1,Label2,etc.);
- 7 TextBox: txtCodigo, txtNome, txtEndereco, txtCidade, txtCep, txtTelefone, txtEmail;
- 2 Button: btnSalvar, btnOrdenar;
- 1 DataGridView – gdvClientes.
O layout do formulário deverá ser parecido com o da figura abaixo:
Nota: Você vai notar que o VB.NET possui mais controles e mais classes e também mais recursos para alinhar os controles no formulário.
Antes de iniciar qualquer código no projeto, devemos definir os namespaces que vamos usar.
Nota: podemos dizer que os Namespaces organizam os objetos em um assembly. Assim, um assembly pode conter um ou mais namespaces, e os namespaces pode conter um ou mais namespaces. Dessa forma, os Namespaces evitam a ambiguidade e organizam referências quando são usados grande grupos de objetos.
Para esse projeto, definimos os seguintes namespaces no início do formulário form1.vb:
Imports System.IO
Imports System.Xml
Antes de iniciarmos o código, vamos explicar alguns detalhes. Vamos utilizar a classe XmlDataDocument que permite armazenar dados e estruturas e manipulá-los através de um DataSet. Para incluir dados no arquivo XML, vamos usar as seguintes classes:
- DataTable: representa uma tabela no formato XML em memória e gerencia dados usando uma coleção de linhas (Rows) e colunas (Columns);
- DataSource: a propriedade DataSource é usada para visualizar os dados no controle DataGridView;
- NewRow: para criar uma linha em branco, usamos o método NewRow da classe DataTable;
- DataSet: a classe DataSet é usada para ler e escrever os dados gerando o arquivo XML através do métodos:
- WriteXml(string nomearquivo)
- ReadXml(string nomearquivo)
Lembrando que o dataset é uma coleção de objetos do tipo DataTable e gerencia uma coleção de tabelas.
No evento do Load do formulário, vamos definir o código que irá ler os dados do arquivo clientes.xml. Se o arquivo não existir, deveremos tratar a exceção e criar a estrutura da tabela usando um objeto DataTable. A seguir, atribuímos o datatable gerado ao DataGridView exibindo os dados no formulário.
Abaixo temos o código VB.NET e C# que faz esse serviço:
VB.NET
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ds = New DataSet()
Try
ds.ReadXml("c:/dados/clientes.xml")
dt = ds.Tables("Clientes")
Catch ex As FileNotFoundException
dt = New DataTable("Clientes")
dt.Columns.Add("Codigo")
dt.Columns.Add("Nome")
dt.Columns.Add("Endereco")
dt.Columns.Add("Cidade")
dt.Columns.Add("Cep")
dt.Columns.Add("Telefone")
dt.Columns.Add("Email")
ds.Tables.Add(dt)
End Try
gdvClientes.DataSource = dt
End Sub
C#
private void Form1_Load(System.Object sender, System.EventArgs e)
{
ds = new DataSet();
try {
ds.ReadXml("c:/dados/clientes.xml");
dt = ds.Tables("Clientes");
} catch (FileNotFoundException ex) {
dt = new DataTable("Clientes");
dt.Columns.Add("Codigo");
dt.Columns.Add("Nome");
dt.Columns.Add("Endereco");
dt.Columns.Add("Cidade");
dt.Columns.Add("Cep");
dt.Columns.Add("Telefone");
dt.Columns.Add("Email");
ds.Tables.Add(dt);
}
gdvClientes.DataSource = dt;
}
Para gravar as informações no arquivo XML e exibi-las no DataGridView, vamos usar o evento Click do botão Salvar. Nesse código, criamos um novo registro em branco usando o método NewRow e atribuímos os valores informados nos controles TextBox ao datarow criado.
A seguir, incluímos a linha criada (DataRow) à coleção de linhas do objeto DataTable (dt) e escrevemos no arquivo XML usando o método WriteXml() do dataset. A rotina limpaControles() apenas limpa os controles TextBox do formulário, deixando-os livres para uma nova inclusão de dados:
VB.NET
Private Sub btnSalvar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalvar.Click
Dim dr As DataRow = dt.NewRow()
dr(0) = txtCodigo.Text
dr(1) = txtNome.Text
dr(2) = txtEndereco.Text
dr(3) = txtCidade.Text
dr(4) = txtCep.Text
dr(5) = txtTelefone.Text
dr(6) = txtEmail.Text
dt.Rows.Add(dr)
ds.WriteXml("c:/dados/clientes.xml")
MessageBox.Show(" Dados salvo com sucesso...")
limpaControles()
End Sub
C#
private void btnSalvar_Click(System.Object sender, System.EventArgs e)
{
DataRow dr = dt.NewRow();
dr[0] = txtCodigo.Text;
dr[1] = txtNome.Text;
dr[2] = txtEndereco.Text;
dr[3] = txtCidade.Text;
dr[4] = txtCep.Text;
dr[5] = txtTelefone.Text;
dr[6] = txtEmail.Text;
dt.Rows.Add(dr);
ds.WriteXml("c:/dados/clientes.xml");
MessageBox.Show(" Dados salvo com sucesso...");
limpaControles();
}
A ordenação das informações é feita no código colocado no evento Click do botão Ordenar. Nesse código, usamos a classe XmlDataDocument() para permitir a ordenação dos dados.
Lemos o arquivo clientes.xml e criamos um DataView para exibir as informações ordenadas por nome no modo Ascendente:
VB.NET
Private Sub btnOrdenar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOrdenar.Click
Dim xmlDatadoc As New XmlDataDocument()
xmlDatadoc.DataSet.ReadXml("c:/dados/clientes.xml")
ds = xmlDatadoc.DataSet
Dim dt As DataView = ds.Tables(0).DefaultView
dt.Sort = "nome ASC"
gdvClientes.DataSource = dt
End Sub
C#
private void btnOrdenar_Click(System.Object sender, System.EventArgs e)
{
XmlDataDocument xmlDatadoc = new XmlDataDocument();
xmlDatadoc.DataSet.ReadXml("c:/dados/clientes.xml");
ds = xmlDatadoc.DataSet;
DataView dt = ds.Tables(0).DefaultView;
dt.Sort = "nome ASC";
gdvClientes.DataSource = dt;
}
Apenas para constar, segue abaixo o código da rotina limpaControles() que percorre os controles TextBox limpando-os:
VB.NET
Private Sub limpaControles()
Dim ctrl As Control
Dim txt As TextBox
For Each ctrl In Me.Controls
If (ctrl.GetType() Is GetType(TextBox)) Then
txt = CType(ctrl, TextBox)
txt.Text = ""
End If
Next
End Sub
C#
private void limpaControles()
{
Control ctrl = default(Control);
TextBox txt = default(TextBox);
foreach ( ctrl in this.Controls)
{
if ((object.ReferenceEquals(ctrl.GetType(), typeof(TextBox))))
{
txt = (TextBox)ctrl;
txt.Text = "";
}
}
}
Executando o projeto e gravando as informações, iremos obter o seguinte resultado:
O arquivo clientes.xml gerado e gravado na pasta c:\dados deverá ter o seguinte conteúdo:
Se você tentar fazer a mesma tarefa usando VB5 ou VB6, também vai conseguir, mas vai gastar mais tempo. Por isso considere migrar suas aplicações para a linguagem VB.NET. Além de ter mais recursos à sua disposição, você vai ter mais tempo livre para viver a vida.
Pegue o projeto completo aqui: CriaDBXML.zip
Eu sei, é apenas XML, mas eu gosto…