VB .NET - Criando um banco de dados XML 


Se você ainda usa o Visual Basic 5 ou 6 e reluta em migrar para a linguagem VB .NET existe uma longa lista de melhorias e facilidades 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, eu não diria difícil, mas trabalhosa, se comparada com o arsenal de recursos que a plataforma .NET oferece.

Para convencê-lo eu 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, visto 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. (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:

Para este 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(modelo) 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:

O leiaute 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 podem conter um ou mais namespaces , e estes namespaces pode conter um ou mais namespaces. Desta forma os Namespaces evitam a ambiguidade e organizam referências quando são usados grande grupos de objetos

Para este 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 do mesmo.

Vamos utilizar a classe XmlDataDocument que permite armazenar dados 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:

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:

A seguir temos o código VB .NET e C# que faz esse serviço:

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
VB .NET
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;
}
 C#

Para Gravar as informações no arquivo XML e exibi-los no DataGridView vamos usar o evento Click do botão Salvar;

Neste 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) a 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:

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
 VB .NET
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();
}
  C#

A ordenação das informações é feita no código colocado no evento Click do botão Ordenar;

Neste 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;

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
VB .NET
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;
}
    C#

Apenas para constar segue abaixo o código da rotina limpaControles() que percorre os controles TextBox limpando-os:

 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
VB .NET
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 = "";
	      }
	}
}
    C#

Executando o projeto e gravando 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 a 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...

Referências:

José Carlos Macoratti