VB .NET - Acesso e Navegação de dados para novatos - I


Há alguns dias recebi um email solicitando alguns esclarecimentos sobre o acesso e a navegação dos dados na linguagem VB .NET.

Era um programador que estava migrando do Visual Basic para o VB .NET que estava começando a usar ADO .NET para acessar dados.

Ele logo percebeu que algumas coisas mudaram no VB .NET.

Onde estão os objetos Recordsets e os métodos MoveNext, MovePrevious, MoveFirst e MoveLast da ADO ?

Obs: Neste meu artigo - VB.NET - Usando ADO para acesso e manutenção de dados eu mostro que ainda podemos usar os recursos da ADO, mas sinceramente eu não recomendo você seguir esse caminho seria como ter uma Ferrari e andar sempre em primeira marcha.

Agora eu tenho duas notícias para você :

Primeira : A ADO.NET não possui recursos de movimentação pelos registros nem suporta cursores. Os recursos de navegação pelos registros tais como MoveFirst , MoveNext , etc. não são suportados.

Segunda : A linguagem VB .NET possui recursos mais avançados para acessar e navegar pelos dados.

Então como acessar os dados e fazer a navegação usando VB .NET ?

Eu mesmo já passei por isso quando dos meus primeiros passos no VB .NET e sei como é.

Por isso resolvi escrever este artigo mostrando como realizar o acesso e a navegação de dados usando ADO .NET e a linguagem VB .NET.

Vou usar uma linguagem bem informal para tratar de assunto básicos mas importantes.

Eu não vou entrar em detalhes sobre ADO .NET, suas classes, métodos e propriedades para isso sugiro que leia os artigos citados nas referências.

Neste artigo eu vou mostrar uma das muitas maneiras que você pode usar para acessar e navegar pelos dados.

Bem, vamos começar abrindo o Visual Studio 2012 Express for desktop que á a última versão estável da plataforma .NET que permite criar programas nas linguagens C# e VB .NET.

Nota : A nova versão esta sendo disponibilizada como uma release candidate - RC - e poderia também ser usada para criar o exemplo deste artigo visto que não houve alterações no assunto que iremos tratar.

Criando o projeto no Visual Studio 2012 Express

Abra o Visual Studio 2012 Express for desktop e clique em New Project;

Selecione o template Visual Basic -> Windows -> Windows Forms Application e informe o nome AcessoDadosVBNET e clique no botão OK;

Isso irá criar uma solução com um projeto Windows Forms contendo um formulário Form1.vb pronto para ser usado.

Quando você criava um projeto no VB6 também era criado um projeto com um formulário form1.vbp.

Agora podemos começar a criar o nosso código no formulário para acessar e navegar pelos dados , certo ?

Errado !!!

Uma coisa que você tem que aprender é não misturar código de acesso a dados com interface de usuário.

Se você colocar o código de acesso aos dados no formulário, vai funcionar mas isso vai lhe trazer dois grandes problemas :

  1. O código que você usar não vai poder ser reutilizado mais;
  2. Se você houver qualquer alteração no código de acesso aos dados você vai ter que mexer no formulário também

Aprenda uma coisa : SEPARE SEMPRE O CÓDIGO DE APRESENTAÇÃO DO CÓDIGO DE ACESSO AOS DADOS

Separar é a palavra chave que vai garantir mais tarde que você possa reutilizar o código de acesso aos dados que você criou e também via facilitar dar manutenção na sua aplicação.

Agindo assim estamos SEPARANDO RESPONSABILIDADES. Interface cuida da apresentação e interação com o usuário e código de acesso a dados cuida de acesso aos dados.

Outra coisa importante a lembrar é que se você colocar o código de acesso aos dados no formulário isso vai afetar a abertura do formulário se houverem muitos dados para acessar.

Como podemos SEPARAR ?

No VB .NET podemos fazer isso de duas formas básicas:

  1. Criando uma simples Classe onde colocamos o código de acesso aos dados
  2. Criando um novo projeto do tipo Class Library na solução onde iremos ter a classe com o código de acesso aos dados

Eu vou usar a segunda opção.

Criando a camada de Acesso aos dados

No menu File clique em Add -> New Project e selecione o template Class Library e informe o nome DAL:

DAL significa Data Access Layer ou camada de acesso aos dados. Usei esse nome por que ele é quase um padrão mas você pode dar o nome que desejar ao novo projeto.

O projeto foi criado com uma classe padrão Class1.vb vamos alterar esse para SQLHelper.vb.

Nessa classe vamos colocar todo o código de acesso aos dados. Eu usei esse nome por que ele é um nome padrão usado para definir uma classe cuja responsabilidades é somente acessar e persistir informações no banco de dados.

A própria Microsoft disponibilizava um recurso conhecido como Microsoft .NET Data Access Application Block onde existem classes que cuidam do acesso aos dados e a classe SQLHelper é uma delas. Você pode usar essa classe em seu projeto se desejar, embora existam atualmente na plataforma .NET outros recursos como o Entity Framework que cuidam do acesso aos dados.

Nota: Se você se interessar em conhecer esse recurso pode fazer o download da Enterprise Library neste link: http://msdn.microsoft.com/library/cc467894.aspx

Antes de continuar vamos decidir qual banco de dados vamos acessar.

Podemos dizer que a plataforma .NET da suporte nativo para você acessar o SQL Server e o Microsoft Access.

Se você for acessar o SQL Server vai ter que usar as classes do namespaces System.Data.SqlClient.

Se você for acessar o Microsoft Access vai ter que usar as classes do namespace System.Data.Oledb.

E se eu quiser acessar outros banco de dados ? Não posso ?

Sim pode ! Mas neste caso você terá que instalar o provedor específico para o banco de dados. Os principais banco de dados disponibilizam um conector para a plataforma .NET.

Vamos acessar um banco de dados SQL Server.

Para este exemplo eu vou criar um banco de dados chamado Cadastro.mdf e uma tabela Clientes com a seguinte estrutura:

Estou criando esse banco de dados no próprio Visual Studio 2012 Express for desktop usando o Database Explorer.

Então vamos definir o código da nossa classe SQLHelper.vb.

Eu quero apenas acessar o banco de dados e selecionar todos os registros da tabela Clientes para exibir no formulário form1.vb.

Vamos definir os namespaces que iremos usar nesta classe:

Imports System.Data
Imports System.Configuration
Imports System.Data.SqlClient

Para acessar o banco de dados eu tenho primeiro que definir a string de conexão e aqui vamos aprender outra coisa muito importante: NUNCA COLOQUE A STRING DE CONEXÃO FIXA NO SEU CÓDIGO.

Se você colocar a string fixa no seu código se precisar alterá-la vai ter que mexer no código e isso não é bom. O Ideal é colocar a string de conexão fora do código em um local central que possa ser acessado pela aplicação.

Um bom local para colocar a string de conexão é no arquivo de configuração da aplicação, no nosso caso, o arquivo App.Config do projeto Windows forms que criamos no início.

Vamos abrir esse arquivo e definir o código abaixo :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <connectionStrings>
    <add name="ClientesSQLServer" connectionString="Data Source=(LocalDB)\v11.0;Initial Catalog=Cadastro;Integrated Security=True" providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

Entre as tags <connectionStrings> eu defini o nome da conexão em name como ClientesSQLServer e a string de conexão em connectionString como :

"Data Source=(LocalDB)\v11.0;Initial Catalog=Cadastro;Integrated Security=True"

E como eu sabia que essa era a string de conexão ???

Simples. Quando eu criei o banco de dados no DataBase Explorer basta eu selecionar o banco de dados e visualizar a janela de propriedades e obter o valor da propriedade Connection String.

Agora temos um local onde armazenamos a string de conexão que pode ser acessado de qualquer parte da solução. Se eu tiver que alterar esse valor basta alterar o arquivo App.Config.

Agora podemos definir o código no arquivo SQLHelper.vb conforme abaixo:

Imports System.Data
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Configuration
Imports System.Data.SqlClient

Namespace DAL

    Public Class SQLHelper

        Private conexao As SqlConnection
        Private dap As SqlDataAdapter
        Private cmd As SqlCommand

        Public Sub New()
            Dim strConexao As String = ConfigurationManager.ConnectionStrings("ClientesSQLServer").ConnectionString
            conexao = New SqlConnection(strConexao)
        End Sub

        ''' <summary>
        ''' carrega todos os registros do banco de dados
        ''' </summary>
        ''' <returns></returns>
        Public Function GetDados(ByVal sql As String) As DataTable

            dap = New SqlDataAdapter(sql, conexao)
            dap.SelectCommand.CommandType = CommandType.Text
            Dim ds As New DataSet()
            Try
                dap.Fill(ds, "Clientes")
                Return ds.Tables("Clientes")
            Catch
                Throw
            Finally
                ds.Dispose()
                dap.Dispose()
                conexao.Close()
                conexao.Dispose()
            End Try
        End Function

    End Class
End Namespace

Nesta classe definimos:

1- Um construtor - Sub New - que irá abrir o arquivo App.Config e obter a string de conexão

2- Um método GetDados - que recebe uma string sql que representa o comando SQL e retorna um DataTable

Em um projeto mais complexo eu criaria métodos para incluir, atualizar e excluir registros.

Pronto ! Criamos a nossa camada de acesso a dados separada da interface.

Definindo a Interface

Lembra quando você criava a interface no formulário do Visual Basic 6 ?

Aqui é a quase mesma coisa, usamos o caixa de ferramentas e arrastamos e soltamos os controles que vamos usar no formulário.

Em nosso formulário eu vou exibir os registros em um controle DataGridView para mostrar todos os registros e em caixas de texto para exibir detalhes de um registro.

Assim iremos usar os seguintes controles:

O leiaute do formulário pode ser visto abaixo:

Dessa forma já temos dois projetos na solução:

  1. AcessoDadosVBNET - Projeto Windows Forms - Interface com o usuário
  2. DAL - projeto Class Library - Camada de acesso a dados

Então vamos acessar a camada de acesso a dados diretamente da camada de interface ?

Não.

Na  próxima parte deste artigo vamos criar a camada de negócios que será chamada pela camada de interface.

Joã_3:3 Respondeu-lhe Jesus: Em verdade, em verdade te digo que se alguém não nascer de novo, não pode ver o reino de Deus.

Referências:


José Carlos Macoratti