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:
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:
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:
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:
Figura 4: Método GravarCliente
Figura 5: Método ConsultarClientes e ExcluirCliente
Figura 6: Método AlterarCliente
Assim finalizo o artigo. Muito obrigado a todos!
Um abraço, e até o próximo artigo.