Olá pessoal, neste artigo veremos como fazer um CRUD básico em Windows Forms usando a linguagem VB.NET e o banco de dados SQL Server.

Introdução

Este artigo é feito já considerando que o leitor esteja habituado com o básico dos conceitos do ADO.NET. Se você não se enquadra neste perfil, pesquise no próprio blog, que tem diversos artigos publicados sobre o assunto.

Antes de qualquer coisa vamos criar a tabela Clientes no SQL Server, veja a estrutura da tabela abaixo, na Figura 1:

Tabela Clientes

Figura 1: Tabela Clientes

Segue abaixo o script para criação da tabela:

CREATE TABLE Clientes
(
          IdCliente   INT IDENTITY(1,1) NOT NULL
        , Nome        VARCHAR(40)       NOT NULL
        , Endereco    VARCHAR(40)       NOT NULL
        , Cidade      VARCHAR(20)       NOT NULL
        , Telefone    VARCHAR(15)           NULL
        , Email       VARCHAR(20)           NULL
        , Ativo       BIT               NOT NULL
        , CONSTRAINT PK_IdCliente PRIMARY KEY (IdCliente)
)

Tabela criada, crie um projeto em Windows Form (lembrando que usaremos a linguagem VB.NET para este artigo) e adicione a ele uma classe, dando a ela o nome de DadosClientes, essa classe irá conter toda a lógica do projeto.

Sem mais delongas, comece importando nesta classe o namespace System.Data.SqlClient:

Imports System.Data.SqlClient

Agora dentro de nossa classe iremos criar outra classe, responsável por conter as variáveis que representarão as colunas de nosso banco de dados (se o projeto fosse em camadas poderíamos dizer que esta classe seria a camada de Modelo dos dados). Veja a classe:

Public Class ClientesObj
    Public IdCliente As Integer = 0
    Public Nome As String = String.Empty
    Public Endereco As String = String.Empty
    Public Cidade As String = String.Empty
    Public Telefone As String = String.Empty
    Public Email As String = String.Empty
    Public Ativo As Boolean = False
End Class

Assim, ao chamar os métodos não preciso ficar passando diversos parâmetros, apenas passo esta classe.

Dando continuidade crie algumas variáveis globais, que iremos usar nos métodos:

'Variável com a string de conexão ao banco
Public Const strConexao As String = "Data Source=WELLINGTON-PC\SQLEXPRESS;Initial Catalog=Artigos;Integrated Security=True"
'Variável que receberá a Instrução SQL, que será passada de acordo com o método usado
Public strInstrucao As String = String.Empty
'Objeto instanciado da classe SqlConnection, com a string de conexão como parâmetro
Public objConexao As New SqlConnection(strConexao)
'Objeto instanciado da classe SqlCommand, com a instrução SQL e o objeto de conexão como parâmetro 
Public objCommand As New SqlCommand(strInstrucao, objConexao)

Note que, fazendo desta forma, não precisamos declará-las em cada método que precisarmos usá-las. As variáveis são referentes aos objetos das classes do ADO.NET, a string de conexão com o banco, além de uma variável que irá receber a instrução SQL (dependendo do método), todas essenciais para nosso projeto.

Vamos agora criar os principais métodos em nossa classe, para que em seguida adicionemos os detalhes finais referentes aos formulários do projeto.

Comece criando o método que irá gravar o cliente na base de dados:

Public Sub GravarCliente(ByVal clientes As ClientesObj)

    strInstrucao = "INSERT INTO Clientes VALUES (@Nome, @Endereco, @Cidade, @Telefone, @Email, @Ativo)"
    objCommand.CommandText = strInstrucao
    objCommand.Connection = objConexao
    objCommand.Parameters.AddWithValue("@Nome", clientes.Nome)
    objCommand.Parameters.AddWithValue("@Endereco", clientes.Endereco)
    objCommand.Parameters.AddWithValue("@Cidade", clientes.Cidade)
    objCommand.Parameters.AddWithValue("@Telefone", clientes.Telefone)
    objCommand.Parameters.AddWithValue("@Email", clientes.Email)
    objCommand.Parameters.AddWithValue("@Ativo", clientes.Ativo)

    objConexao.Open()
    objCommand.ExecuteNonQuery()
    objConexao.Close()

End Sub

O método para atualizar o cliente será praticamente o mesmo, apenas com a adição do IdCliente, que será nosso parâmetro para o Where de nosso Update (lembrando que nunca deveremos criar um UPDATE ou DELETE sem WHERE).

Dito isto, não irei exibir aqui o método para atualizar o cliente, já que o projeto completo encontra-se disponível para download no topo da página.

Veja abaixo o método para excluir o cliente da base de dados:

Public Sub ExcluirCliente(ByVal IdCliente As Integer)

    strInstrucao = "DELETE FROM Clientes WHERE IdCliente = @IdCliente"
    objCommand.CommandText = strInstrucao
    objCommand.Connection = objConexao
    objCommand.Parameters.AddWithValue("@IdCliente", IdCliente)

    objConexao.Open()
    objCommand.ExecuteNonQuery()
    objConexao.Close()

End Sub

Bem simples, não é mesmo? Seguindo a mesma lógica dos outros. Finalizando, veja o método para consultar os clientes, um pouco diferentes dos outros:

Public Function ConsultarClientes() As DataTable

    Dim dt As New DataTable
    Dim ds As New DataSet()
    strInstrucao = "SELECT IdCliente, Nome, Endereco, Telefone, Ativo FROM Clientes"
    objCommand.CommandText = strInstrucao
    objCommand.Connection = objConexao

    objConexao.Open()
    Dim da As New SqlDataAdapter(objCommand)
    da.Fill(ds)
    dt = ds.Tables(0)

    objConexao.Close()
    Return dt

End Function

Note que aqui usei DataTable, DataSet e DataAdapter, componentes muito importantes do ADO.NET.

Crie um formulário e dê a ele o nome de Cadastro. Nele, adicione alguns controles para que o mesmo fique como a Figura 2 nos mostra:

Formulário de Cadastro

Figura 2: Formulário de Cadastro

Bem simples. Esse botão Ver nos levará para a tela de Consulta, que criaremos logo abaixo.

Apenas altere a propriedade Modifiers dos TextBoxes e dos RadioButtons para Public. Você entenderá o porque disso mais à frente.

No form de Consulta, adicione um ListView e três Buttons. No ListView configure as propriedades GridLines para True, FullRowSelect para True, MultiSelect para False e View para Details. Adicione também nele 5 colunas. Veja como o formulário ficará na Figura 2:

Formulário de Consulta

Figura 3: Formulário de Consulta

Finalizando, vá à página de códigos do form de Cadastro e declare uma variável global (que será “enxergada” em todo o form) do tipo Integer:

Public IdCliente As Integer = 0

Ela irá receber o Id do Cliente do form de Consulta, para assim definirmos quando for Alteração ou Gravação de dados.

Agora vamos criar a codificação para os formulários do projeto e testarmos o funcionamento dos métodos de nossa classe.

Veja abaixo a codificação do método que será chamado no botão Gravar do form Cadastro (não trabalharemos com validações neste artigo, já que o intuito do artigo não é este, apesar delas terem sido feitas no projeto):

Private Sub Gravar()

        Dim classe As New DadosClientes
        Dim objeto As New DadosClientes.ClientesObj

         objeto.Nome = txtNome.Text.Trim()
        objeto.Endereco = txtEndereco.Text.Trim()
        objeto.Cidade = txtCidade.Text.Trim()
        objeto.Telefone = mtbTelefone.Text.Trim()
        objeto.Email = txtEmail.Text.Trim()

        If rbtAtivo.Checked Then
            objeto.Ativo = True
        Else
            objeto.Ativo = False
        End If

        If (IdCliente > 0) Then
            objeto.IdCliente = IdCliente
            classe.AtualizarCliente(objeto)
        Else
            classe.GravarCliente(objeto)
        End If

End Sub

Note que usando a classe tudo fica mais fácil e nosso código não fica muito “poluído”. O que fiz acima foi instanciar a classe em uma variável e instanciar a classe criada dentro de nossa classe principal em outra variável. Depois atribuí a cada objeto de minha classe ClientesObj o valor nos campos, seguido do método Trim(), que remove os espaços em branco. Ao final verifico o valor da variável IdCliente. Se for maior que 0 chamo o método AtualizarCliente, passando o Id pro objeto. Senão chamo o GravarCliente passando o objeto carregado com os valores respectivos.

Agora vá ao form de Consulta e declare uma variável pública que irá receber o índice da linha do ListView:

Dim index As Integer

Para que façamos isso devemos usar o evento Click do ListView. Chame-o e faça a seguinte codificação:

Private Sub lsvDados_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lsvDados.Click
        If lsvDados.SelectedItems.Count > 0 Then
            index = lsvDados.SelectedItems(0).Index
        End If
End Sub

Agora veja o método que irá popular nosso ListView com os dados do banco:

Private Sub CarregarListView()

        Dim objDados As New DadosClientes()
        Dim dt As New DataTable
        dt = objDados.ConsultarClientes()

        For Each linha As DataRow In dt.Rows
            Dim lista As New ListViewItem
            lista.Text = linha("IdCliente").ToString()
            lista.SubItems.Add(linha("Nome").ToString())
            lista.SubItems.Add(linha("Endereco").ToString())
            lista.SubItems.Add(linha("Telefone").ToString())

            If linha("Ativo").ToString().Equals("True") Then
                lista.SubItems.Add("Sim")
            Else
                lista.SubItems.Add("Não")
            End If

            lsvDados.Items.Add(lista)
        Next

End Sub

Apenas instanciei um DataTable, que recebeu meu método que é do mesmo tipo, fiz um laço foreach, para pesquisar em cada linha do DataTable, dentro dele instanciei um ListViewItem e fui adicionando nele os valores do DataRow. Ao final jogo em meu ListView os itens adicionados a variável do ListViewItem.

Você pode chamar este método no evento Load do formulário, só dar dois cliques no form para que o evento seja chamado.

Crie o método Excluir, você precisará de apenas 2 linhas de código:

Private Sub ExcluirRegistro(ByVal IdCliente As Integer)

        Dim objDados As New DadosClientes()
        objDados.ExcluirCliente(IdCliente)

End Sub

Como o método é do tipo Integer, você deve chama-lo passando o Id do Cliente que você deseja excluir. Para isso codifique o evento click do botão Excluir:

Private Sub btnExcluir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExcluir.Click

        If lsvDados.SelectedItems.Count > 0 Then
            ExcluirRegistro(Integer.Parse(lsvDados.Items(index).Text))
        End If

End Sub

Note que eu passo o valor da variável index, que é a coluna IdCliente.

Finalizando, vamos ao método Alterar. Para ficar tudo mais fácil, se o usuário clicar em Alterar ele volta pra tela de Cadastro com os dados preenchidos e clica em Gravar. Lembra que nossos campos da tela de Cadastro tem a propriedade Modifiers como Public? Então, é agora que entenderemos o porquê disso.

Veja a codificação no evento click do botão Alterar:

Private Sub btnAlterar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAlterar.Click

        If lsvDados.SelectedItems.Count > 0 Then
            Dim instancia As New Cadastro()
            instancia.IdCliente = Integer.Parse(lsvDados.Items(index).Text)
            instancia.txtNome.Text = lsvDados.Items(index).SubItems(1).Text
            instancia.txtEndereco.Text = lsvDados.Items(index).SubItems(2).Text
            instancia.mtbTelefone.Text = lsvDados.Items(index).SubItems(3).Text

            If lsvDados.Items(index).SubItems(4).Text.Equals("Sim") Then
                instancia.rbtAtivo.Checked = True
            Else
                instancia.rbtInativo.Checked = True
            End If

            instancia.ShowDialog()
            Me.Close()
        End If

End Sub

Entenderam? Dessa forma eu passo para os campos do form de Cadastro os valores de meu ListView (como este é um teste não passei todos os valores).

Finalizando, faça os testes. Veja os mesmos nas Figuras 4, 5 e 6:

Método GravarCliente

Figura 4: Método GravarCliente

Método ConsultarClientes e ExcluirCliente

Figura 5: Método ConsultarClientes e ExcluirCliente

Método AlterarCliente

Figura 6: Método AlterarCliente

Assim finalizo o artigo. Muito obrigado a todos!

Um abraço, e até o próximo artigo.