VB .NET - Cadastro de Contatos com Foto no SQL Server
A figura abaixo mostra a tela principal do aplicativo para Cadastro de contatos com foto no SQL Server 2008 feito na linguagem VB .NET.
Ele apresenta as funcionalidades básicas de acesso, navegação e manutenção de dados usando um banco de dados SQL Server.
O objetivo deste artigo é mostrar como criar esse aplicativo usando o Visual Basic 2010 Express Edition e o SQL Server 2008 Express Edition.
Existem muitas maneiras diferentes de criarmos uma aplicação como essa no Visual Basic .NET vou citar algumas delas:
Nesta aplicação eu vou incluir o código no formulário por questão de simplicidade. Não vou criar uma aplicação em camadas como sugere as boas práticas.
Em um outro artigo eu vou mostrar como ajustar esta aplicação para uma aplicação em camadas.
Criando o Banco de Dados e a Tabela
Eu vou utilizar a última por apresentar os conceitos básicos das tarefas de acesso e manutenção de dados em um SGBD relacional como SQL Server.
Vou começar criando o banco de dados Cadastro e a tabela Contatos que serão usados no projeto.
Para realizar esta tarefa vou usar o SQL Server 2008 Management Studio (SSMS).
Na figura abaixo temos o banco de dados Cadastro e a tabela Contatos. A estrutura da tabela contato indica que o campo id é uma chave primária do tipo identity e que as imagens serão armazenadas no campo do tipo image;
Após criar o banco de dados e a tabela vamos definir a string de conexão nas propriedades do projeto na guia Settings onde criamos a variável CadastroConnectionString e definimos a string de conexão como sendo : Server=.\SQLExpress;;Initial Catalog=Cadastro;Integrated Security=SSPI
Criando o projeto Windows Forms
Abra o Visual Basic 2010 Express Edition e no menu File Clique em New Project selecionando o template Windows Forms Application com o nome CadastroVBNET;
A seguir defina o leiaute do formulário padrão form1.vb conforme a imagem a seguir:
|
Definindo o código do formulário
Vamos agora definir o código inserido no formulário form1.vb onde iremos definir procedimentos e funções bem como incluir código em eventos dos controles de formulário.
1 - declarando os namespaces usados
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
2- definindo as variáveis globais do formulário
Dim Str As String =
My.Settings.CadastroConnectionString.ToString
Dim sqlDa As New SqlDataAdapter
Dim dtb As DataTable
Dim sqlCon As New SqlConnection(Str)
Dim sqlCmd As New SqlCommand
3- Código do evento Load do formulário form1:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ofdImagem.Filter = "Todos(*.Jpg, *.Jpeg, *.Bmp)|*.Jpg; *.Jpeg; *.Bmp" CarregarDados() CarregarImagem() 'ativa o modo de seleção de linha dgvAgenda.SelectionMode = DataGridViewSelectionMode.FullRowSelect 'ajusta o tamanho das células Me.dgvAgenda.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells 'esconde a coluna da imagem Me.dgvAgenda.Columns(1).Visible = False End Sub |
Este código carrega os dados e a imagem e exibe no controle Datagridview.
4- Código do procedimento CarregaDados() que seleciona os dados da tabela Contatos e exibe no DataGridView:
Private Sub CarregarDados() Try With sqlCmd .CommandType = CommandType.Text .CommandText = "SELECT * from Contatos" .Connection = sqlCon End With With sqlDa .SelectCommand = sqlCmd dtb = New DataTable .Fill(dtb) dgvAgenda.DataSource = dtb End With Catch ex As Exception MsgBox(ex.Message) Finally sqlCon.Close() End Try End Sub |
Seleciona todos os dados da tabela Contatos e exibe no datagridview.
5- Código do procedimento CarregarImagem() que atualiza as caixas de texto do formulário com os dados selecionados no DataGridView e obtém a imagem:
Private Sub CarregarImagem() Try Me.lblCodigo.Text = Me.dgvAgenda.CurrentRow.Cells("id").Value Me.txtNome.Text = Me.dgvAgenda.CurrentRow.Cells("nome").Value Me.txtSobrenome.Text = Me.dgvAgenda.CurrentRow.Cells("sobreNome").Value Me.txtCidade.Text = Me.dgvAgenda.CurrentRow.Cells("cidade").Value Me.txtEstado.Text = Me.dgvAgenda.CurrentRow.Cells("estado").Value Me.txtNascimento.Text = Me.dgvAgenda.CurrentRow.Cells("nascimento").Value Me.txtEmail.Text = Me.dgvAgenda.CurrentRow.Cells("email").Value Dim ms As New MemoryStream(ObtemImagem(CInt(dgvAgenda.SelectedCells(0).Value))) picImagem.Image = Image.FromStream(ms) Catch ex As Exception MsgBox("Erro : " & ex.Message) End Try End Sub |
6 - Código da função ObtemImagem() que retorna um array de bytes contendo a imagem:
Function ObtemImagem(ByVal Img As Integer) As Byte() Dim Imagem() As Byte = Nothing With sqlCmd .CommandType = CommandType.Text .CommandText = "Select imagem From Contatos Where id = " & Img .Connection = sqlCon End With Try sqlCon.Open() Imagem = CType(sqlCmd.ExecuteScalar(), Byte()) Catch ex As Exception MsgBox("Erro : " + ex.Message) Finally sqlCon.Close() End Try Return Imagem End Function |
7- Código do evento Click do botão de comando Alterar Imagem que abre a caixa de diálogo OpenFileDialog e atualiza o controle PicImage com a imagem selecionada:
Private Sub btnProcurarFoto_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcurarFoto.Click If ofdImagem.ShowDialog = DialogResult.OK Then picImagem.Image = System.Drawing.Image.FromFile(ofdImagem.FileName) End If End Sub |
8 - Código do evento Click do botão de comando Novo que limpa as caixas de texto, faz a validação e chama a rotina InserirDados() para atualizar a tabela Contatos com um novo registro:
Private Sub btnCadastrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCadastrar.Click If btnCadastrar.Text = "Novo" Then limpaCampos() txtNome.Focus() btnCadastrar.Text = "Cadastrar" Else If btnCadastrar.Text = "Cadastrar" Then If ValidaDados() Then InserirDados() btnCadastrar.Text = "Novo" Else MsgBox("Informe o nome , sobrenome , estado , cidade e selecione Imagem para cadastramento...") End If End If End If End Sub |
9 - Código da rotina InserirDados() que inclui um novo registro na tabela Contatos:
Private Sub InserirDados() Try sqlCon.Open() Dim arrFilename() As String = Split(Text, "\") Array.Reverse(arrFilename) Dim ms As New MemoryStream picImagem.Image.Save(ms, picImagem.Image.RawFormat) Dim arrImage() As Byte = ms.GetBuffer With sqlCmd .CommandType = CommandType.Text .CommandText = "" .CommandText = "INSERT INTO Contatos (imagem, nome, sobrenome, cidade, estado, nascimento, email ) _ VALUES (@Imagem,@nome,@sobrenome,@cidade,@estado,@nascimento,@email)" _ & "SELECT * FROM Contatos WHERE (Id = SCOPE_IDENTITY())" .Connection = sqlCon .Parameters.Add(New SqlParameter("@Imagem", SqlDbType.Image)).Value = arrImage .Parameters.Add(New SqlParameter("@nome", SqlDbType.NVarChar)).Value = txtNome.Text .Parameters.Add(New SqlParameter("@sobrenome", SqlDbType.NVarChar)).Value = txtSobrenome.Text .Parameters.Add(New SqlParameter("@cidade", SqlDbType.NVarChar)).Value = txtCidade.Text .Parameters.Add(New SqlParameter("@estado", SqlDbType.NVarChar)).Value = txtEstado.Text .Parameters.Add(New SqlParameter("@nascimento", SqlDbType.NVarChar)).Value = txtNascimento.Text .Parameters.Add(New SqlParameter("@email", SqlDbType.NVarChar)).Value = txtEmail.Text End With sqlCmd.ExecuteNonQuery() CarregarDados() MsgBox("Registro Inserido com Sucesso.", MsgBoxStyle.Information) Catch ex As Exception MsgBox(ex.Message) Finally sqlCmd.Parameters.Clear() sqlCon.Close() End Try End Sub |
10 - Código do evento Click do botão de comando Alterar que faz a validação e chama a rotina AlterarDados():
Private Sub btnAlterar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAlterar.Click If ValidaDados() Then AlterarDados() Else MsgBox("Informe o nome , sobrenome , estado e cidade e selecione imagem para alteração de dados...") End If End Sub |
11 - Código da rotina AlterarDados() que altera os dados de um registro na tabela Contatos:
Private Sub AlterarDados() Try sqlCon.Open() Dim arrFilename() As String = Split(Text, "\") Array.Reverse(arrFilename) Dim ms As New MemoryStream picImagem.Image.Save(ms, picImagem.Image.RawFormat) Dim arrImage() As Byte = ms.GetBuffer With sqlCmd .CommandType = CommandType.Text .CommandText = "" .CommandText = "UPDATE [Contatos] SET [imagem] = @Imagem, [nome] = '" & txtNome.Text & "', [sobrenome] = '" _ & txtSobrenome.Text & "' , [email] = '" & txtEmail.Text & "', [cidade] = '" & txtCidade.Text & "' , [estado] = '" _ & txtEstado.Text & "' WHERE ([Id] = " & Me.lblCodigo.Text & ");" & _ "SELECT * FROM Contatos WHERE (Id = " & Me.lblCodigo.Text & ")" .Connection = sqlCon .Parameters.Add(New SqlParameter("@Imagem", SqlDbType.Image)).Value = arrImage End With sqlCmd.ExecuteNonQuery() CarregarDados() MsgBox("Registro Alterado com Sucesso.", MsgBoxStyle.Information) Catch ex As Exception MsgBox(ex.Message) Finally sqlCmd.Parameters.Clear() sqlCon.Close() End Try End Sub |
12 - Código do evento Click do botão de comando Deletar que chama a rotina ExcluirDados():
Private Sub btnDeletar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDeletar.Click If MessageBox.Show("Confirma a Exclusão do registro : " & lblCodigo.Text & " ? ", "Excluir", MessageBoxButtons.YesNo, MessageBoxIcon.Information) = vbYes Then ExcluirDados() End If End Sub |
13- Código da rotina ExcluirDados() que remove um registro da tabela Contatos:
Private Sub ExcluirDados() Try sqlCon.Open() With sqlCmd .CommandText = "Delete from Contatos where id = " & Me.lblCodigo.Text .Connection = sqlCon End With sqlCmd.ExecuteNonQuery() CarregarDados() MsgBox("Registro deletado com Sucesso.", MsgBoxStyle.Information) Catch ex As Exception MsgBox(ex.Message) Finally sqlCmd.Parameters.Clear() sqlCon.Close() End Try End Sub |
14 - Código do evento Click do botão de comando Localizar que chama a rotina LocalizarDados():
Private Sub btnLocalizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLocalizar.Click LocalizarDados() End Sub |
15 - Código da rotina LocalizarDados():
Private Sub LocalizarDados() Dim msg, titulo, valor, nome As String msg = "Informe o nome a procurar." titulo = "Procurar Registro" ' define o titulo. valor = "A" ' define o valor padrao ' Exibe mensagem posicionada nome = InputBox(msg, titulo, valor, 800, 400) If nome <> String.Empty Then Try Dim sqlCmdSqlBuscaRegistro As String = "SELECT * from Contatos where nome like '%" & nome & "%'" With sqlCmd .CommandType = CommandType.Text .CommandText = sqlCmdSqlBuscaRegistro .Connection = sqlCon End With With sqlDa .SelectCommand = sqlCmd dtb = New DataTable .Fill(dtb) dgvAgenda.DataSource = dtb End With Catch ex As Exception MsgBox("Não foram encontrados registros com este parâmetro.") End Try End If End Sub |
16 - Código do evento Click do botão de comando Carregar Dados que chama a rotina CarregarDados():
Private Sub btnCarregaDados_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCarregaDados.Click CarregarDados() End Sub |
17 - Código da rotina ValidaDados
Private Function ValidaDados() As Boolean If txtNome.Text <> String.Empty And txtSobrenome.Text <> String.Empty And txtEstado.Text <> String.Empty And txtCidade.Text <> _ String.Empty And picImagem.Image IsNot Nothing Then Return True Else Return False End If End Function |
18 - Código da rotina LimpaCampos()
Private Sub limpaCampos() txtNome.Text = "" txtSobrenome.Text = "" txtCidade.Text = "" txtEstado.Text = "" txtEmail.Text = "" txtNascimento.Text = "" picImagem.Image = Nothing End Sub |
19 - Código dos eventos Click dos botões de navegação:
Private Sub btnPrimeiro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrimeiro.Click ' Vai para o primeiro registro... Me.BindingContext(dtb).Position = 0 CarregarImagem() End Sub Private Sub btnAnterior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnterior.Click ' Volta um registro... Me.BindingContext(dtb).Position -= 1 CarregarImagem() End Sub Private Sub btnProximo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProximo.Click ' Avança um registro... Me.BindingContext(dtb).Position += 1 CarregarImagem() End Sub Private Sub btnUltimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUltimo.Click ' Vai para o último registro... Me.BindingContext(dtb).Position = dtb.Rows.Count CarregarImagem() End Sub |
20- Código do evento Click do botão de comando Sair:
Private Sub btnSair_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSair.Click If MessageBox.Show("Confirma o encerramento do sistema ? ", "Encerrar", MessageBoxButtons.YesNo, MessageBoxIcon.Information) = vbYes Then ExcluirDados() End If End Sub |
21- Código do eventos CellEndEdit e Click do controle DataGridView:
Private Sub dgvAgenda_CellEndEdit(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvAgenda.CellEndEdit Me.txtNome.Text = Me.dgvAgenda.CurrentCell.Value AlterarDados() CarregarImagem() End Sub Private Sub dgvAgenda_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dgvAgenda.Click CarregarImagem() End Sub |
O projeto completo esta no SUPER DVD .NET
Rom 8:5
Pois os que são segundo a carne inclinam-se para as coisas da carne; mas os que são segundo o Espírito para as coisas do Espírito.Rom 8:6
Porque a inclinação da carne é morte; mas a inclinação do Espírito é vida e paz.Referências: