VB .NET -  Criando um Banco de dados SQL Server, Tabela, Stored Procedure e View via código


 Este artigo mostra como criar um banco de dados, tabela, Stored Procedure , View  no SQL Server e também como preencher a tabela com dados via código usando a linguagem VB .NET.

Neste artigo vamos criar uma aplicação VB .NET que vai criar de forma automática e via código um banco de dados no SQL Server, uma tabela, uma Store Procedure, uma View e no fim preencher a tabela com dados exibindo-os em controle DataGridView.

Recursos Usados

Criando projeto no VS 2017

Abra o VS 2017 Community e crie um novo projeto usando a linguagem Visual Basic e o template Windows Classic Desktop -> Windows Forms App(.NET Framework) com o nome CriaBancoDados:

Após criar o projeto inclua um novo formulário no projeto via menu Project-> Add Windows Forms com o nome Status. Assim o projeto deverá possuir a seguinte estrutura:

O formulário Form1.vb será o formulário principal e o formulário Status.vb será usado para exibir mensagens de status das operações realizadas na aplicação.

Configurando o ambiente : definindo as variáveis usadas no projeto

Neste projeto iremos acessar o banco de dados SQL Server para poder criar um banco de dados, tabela, stored procedure e view.

Dessa forma temos que definir a string de conexão com o banco de dados e o melhor local para fazer isso seria o arquivo App.Config, mas para variar eu vou definir as variáveis usadas no projeto no formulário Form1.vb.

Para tornar o código mais fácil de ler vou usar o recurso #Region/#End Region que permite agrupar código e assim organizar por seções o código do projeto.

Veja como o código fica mais legível após criarmos cada seção no formulário usando #Region:

Inclua os seguintes namespaces no início do formulário :

Imports System.Data.SqlClient
Imports System.Data

Agora na primeira #Region do formulário definimos as variáveis usadas no projeto :

   ' Inicializa as constantes para conexão com o banco de dados
    ' e exibe o erro de conexão ao usuário se houver
#Region "Define variáveis usadas no projeto"
    Protected Const SqlConnectionString As String = 
        "Server=(local);" & _
        "DataBase=;" & _
        "Integrated Security=SSPI"
    Protected Const MensagemErroConexao As String = _
        "Para executar este exemplo você tem que ter o SQL Server " & _
        "instalado.  Para " & _
        "instruções de instalação veja o arquivo de documentação."
    Protected JaEstaConectado As Boolean = False
    Protected JaCriouTabela As Boolean = False
    Protected connectionString As String = SqlConnectionString
#End Region

Definindo a interface do formulário Form1.vb

No formulário Form1.vb vamos incluir a partir da ToolBox:

Definindo a interface do formulário Status.vb

No formulário Status.vb vamos incluir apenas um controle Label - Label1

E vamos definir o seguinte código neste formulário:

Public Class Status
    Public Overloads Sub Show(ByVal Mensagem As String)
        Label1.Text = Mensagem
        Me.Show()
        Application.DoEvents()
    End Sub
End Class

Aqui sobrescrevemos o método Show para exibir mensagens na Label do formulário.

Pronto. Isso é tudo o que o formulário Status vai fazer.

Agora veremos o código implementado no formulário Form1.vb. Como ele esta comentado só vou tecer explicações quando for pertinente.

Código do evento Load

#Region "Form load"
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ResetarUI()
        Me.Height = 310
        Me.Width = 547
    End Sub
#End Region

Reseta a interface como usuário e define o tamanho inicial do formulário Form1.vb.

Código do método ResetarUI()

#Region "Resetar UI"
    ' Define a interface com o  usuário
    Private Sub ResetarUI()
        lblSeta1.Visible = False
        lblPasso2.Enabled = False
        btnCriarTabela.Enabled = False
        lblSeta2.Visible = False
        lblPasso3.Enabled = False
        btnCriarSP.Enabled = False
        lblSeta3.Visible = False
        lblPasso4.Enabled = False
        btnCriarView.Enabled = False
        lblSeta4.Visible = False
        lblPasso5.Enabled = False
        btnPopularTabela.Enabled = False
        lblSeta5.Visible = False
        lblPasso6.Enabled = False
        btnExibirDados.Enabled = False
        With dgvDados
            .Visible = False
            .DataSource = Nothing
        End With
    End Sub
#End Region

Criando o banco de dados TesteDB

#Region "Criar banco de dados"
    Private Sub btnCriarDB_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCriarDB.Click
        ' Se o botão Criar Tabela esta habilitado então o usuário tentou recriar o banco de dados novamente
        ' e ele é alertado sobre isso
        If btnCriarTabela.Enabled Then
            Dim dr As DialogResult = MessageBox.Show("Recriando o banco de dadaos " &
                "irá desfazer os outros passos da criação do objeto banco de dados realizados " &
                ". Deseja continuar ?", "Re-Criação do Banco de dados " &
                "Alerta", MessageBoxButtons.YesNo, MessageBoxIcon.Warning)
            If dr = Windows.Forms.DialogResult.Yes Then
                ResetarUI()
                CriarBancoDados()
            End If
        Else
            CriarBancoDados()
        End If
    End Sub
    ' Executa uma instrução SQL que deleta o banco de dados se existir e então o recria
    Private Sub CriarBancoDados()
        Dim sqlStatement As String = _
            "IF EXISTS (" & _
            "SELECT * " & _
            "FROM master.dbo.sysdatabases " & _
            "WHERE Name =  'TesteDB' )" & vbCrLf & _
            "DROP DATABASE  TesteDB" & vbCrLf & _
            "CREATE DATABASE TesteDB"
        ' Exibe uma mensagem de status sobre a conexão
        Dim statusForm As New Status()
        If Not JaEstaConectado Then
            statusForm.Show("Se conectando ao SQL Server...")
        End If
        ' Tenta se conectar com uma instância do SQL Server
        Try
            ' A classe SqlConnection permite se conectar com o SQL Server.
            ' O construtor aceita a string de conexão como um argumento
            ' Ela usa  Integrated Security, que significa que voce
            ' precisa ter um login no SQL Server, ou ser parte do grupo Administrator
            Dim connection As New SqlConnection(connectionString)
            ' Um objeto SqlCommand é usando para executar comandos SQL 
            Dim cmd As New SqlCommand(sqlStatement, connection)
            ' Abra a conexão , executa o comando e fecha a conexao
            ' Usar ExecuteNonQuery é mais eficiente quando não temos dados retornados
            connection.Open()
            cmd.ExecuteNonQuery()
            connection.Close()
            ' Dados submetidos com sucesso
            JaEstaConectado = True
            JaCriouTabela = True
            statusForm.Close()
            ' Exibe os controles para próximo passo
            lblSeta1.Visible = True
            lblPasso2.Enabled = True
            btnCriarTabela.Enabled = True
            MsgBox("Banco de dados TesteDB  criado com sucesso.", MsgBoxStyle.OkOnly, "Status da Criação do Banco de dados")
        Catch sqlExc As SqlException
            MsgBox(sqlExc.Message, MsgBoxStyle.OkOnly, "Erro SQL Exception")
        Catch exc As Exception
            ' Não foi possível se conectar como SQL Server ou MSDE
            statusForm.Close()
            MsgBox(exc.Message, MsgBoxStyle.OkOnly, "A conexão falhou...")
        End Try
    End Sub

Nesta região temos o código do evento Click do botão Criar Banco de dados que chama o método CriarBancoDados que cria o banco de dados TesteDB no SQL Server.

Criando a tabela Contato

#Region "Criar tabela"
    Private Sub btnCriarTabela_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCriarTabela.Click
        'define a instrução SQL usada
        Dim strSQL As String = _
            "USE TesteDB" & vbCrLf & _
            "IF EXISTS (" & _
            "SELECT * " & _
            "FROM TesteDB.dbo.sysobjects " & _
            "WHERE Name = 'Contato' " & _
            "AND TYPE = 'u')" & vbCrLf & _
            "BEGIN" & vbCrLf & _
            "DROP TABLE TesteDB.dbo.Contato" & vbCrLf & _
            "END" & vbCrLf & _
            "CREATE TABLE Contato (" & _
            "ContatoID Int NOT NULL," & _
            "Nome NVarChar(40) NOT NULL," & _
            "Sobrenome NVarChar(40) NOT NULL," & _
            "Endereco NVarChar(100) NOT NULL" & ")"
        Try
            ' A classe SqlConnection permite se comunicar com o  SQL Server.
            ' O construtor aceita uma string de conexão como argumento.
            ' Ela usa a Integrated Security, que significa que você tem que ter um login com o SQL Server
            ' ou fazer parte do grupo Administrators
            Dim dbConnection As New SqlConnection(connectionString)
            ' Um objeto SqlCommand é usado para executar comandos SQL
            Dim cmd As New SqlCommand(strSQL, dbConnection)
            ' Abre a conexão, executa o comando e fecha a conexão
            ' Usa ExecuteNonQuery pois não retorna dados
            dbConnection.Open()
            cmd.ExecuteNonQuery()
            dbConnection.Close()
            ' Exibe os controles para proximo passo
            lblSeta2.Visible = True
            lblPasso3.Enabled = True
            btnCriarSP.Enabled = True
            MessageBox.Show("Tabela 'Contato' criada com sucesso.",
                "Status da criação da Tabela",
                MessageBoxButtons.OK, MessageBoxIcon.Information)
        Catch sqlExc As SqlException
            MessageBox.Show(sqlExc.ToString, "Erro SQL Exception!",
                MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
#End Region

Este código cria a tabela Contato contendo os campos : ContatoID, Nome, Sobrenome e Endereco.

Criando a Stored Procedure AdicionaContatos

#Region "Criar stored procedure"
    'Aqui execuamos duas instruções SQL; uma que exlcui a Procedure se ela existir e outra que cria a procedure
    Private Sub btnCriarSP_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCriarSP.Click
        Dim dbConnection As New SqlConnection(connectionString)
        Dim strSQL As String = _
            "USE TesteDB" & vbCrLf & _
            "IF EXISTS (" & _
            "SELECT * " & _
            "FROM TesteDB.dbo.sysobjects " & _
            "WHERE Name = 'AdicionaContatos' " & _
            "AND TYPE = 'p')" & vbCrLf & _
            "BEGIN" & vbCrLf & _
            "DROP PROCEDURE AdicionaContatos" & vbCrLf & _
            "END"
        Dim cmd As New SqlCommand(strSQL, dbConnection)
        Try
            dbConnection.Open()
            cmd.ExecuteNonQuery()
        Catch sqlExc As SqlException
            MessageBox.Show(sqlExc.ToString, "Erro SQL Exception!",
                MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
        Try
            cmd.CommandText = _
                "CREATE PROCEDURE AdicionaContatos AS" & vbCrLf & _
                "INSERT INTO Contato" & vbCrLf & _
                "(ContatoID, Nome, Sobrenome, Endereco)" & _
                "SELECT EmployeeID, FirstName, LastName, Address " & _
                "FROM Northwind.dbo.Employees"
            cmd.ExecuteNonQuery()
            dbConnection.Close()
            lblSeta3.Visible = True
            lblPasso4.Enabled = True
            btnCriarView.Enabled = True
            MessageBox.Show("Stored Procedure 'AdicionaContatos' criada " &
                "com sucesso", "Status da Criação da Stored Procedure",
                MessageBoxButtons.OK, MessageBoxIcon.Information)
        Catch sqlExc As SqlException
            MessageBox.Show(sqlExc.ToString, "Erro SQL Exception!",
                MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
#End Region

Neste código criamos a stored procedure AdicionaContatos e inserimos dados na tabela Contato a partir da tabela Employees do banco de dados Northwind.mdf.

Criando a View GetContatos

#Region "Criar view"
    'aqui executamos duas instruções SQL uma que exclui a View se ela existir e outra que cria a View
    Private Sub btnCriarView_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCriarView.Click
        Dim dbConnection As New SqlConnection(connectionString)
        Dim strSQL As String = _
            "USE TesteDB" & vbCrLf & _
            "IF EXISTS (" & _
            "SELECT * " & _
            "FROM TesteDB.dbo.sysobjects " & _
            "WHERE Name = 'GetContatos' " & _
            "AND TYPE = 'v')" & vbCrLf & _
            "BEGIN" & vbCrLf & _
            "DROP VIEW GetContatos" & vbCrLf & _
            "END"
        Dim cmd As New SqlCommand(strSQL, dbConnection)
        Try
            dbConnection.Open()
            cmd.ExecuteNonQuery()
        Catch sqlExc As SqlException
            MessageBox.Show(sqlExc.ToString, "Erro SQL Exception!",
                MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
        Try
            ' Altera a instrução SQL para a proxima query
            cmd.CommandText = _
                "CREATE VIEW GetContatos AS " & _
                "SELECT * " & _
                "FROM Contato"
            cmd.ExecuteNonQuery()
            dbConnection.Close()
            lblSeta4.Visible = True
            lblPasso5.Enabled = True
            btnPopularTabela.Enabled = True
            MessageBox.Show("View 'GetContatos' criada com " &
                "sucesso.", "Status da criação da SQL View",
                MessageBoxButtons.OK, MessageBoxIcon.Information)
        Catch sqlExc As SqlException
            MessageBox.Show(sqlExc.ToString, "Erro SQL Exception!",
                MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
#End Region

Populando a tabela Contato

#Region "Popular tabela"
    'Executa a stored procedure que preenche a tabela Contato com informações do banco de dados Northwind
    Private Sub btnPopularTabela_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPopularTabela.Click
        Dim strSQL As String = "EXECUTE TesteDB.dbo.AdicionaContatos"
        Try
            Dim dbConnection As New SqlConnection(connectionString)
            Dim cmd As New SqlCommand(strSQL, dbConnection)
            dbConnection.Open()
            cmd.ExecuteNonQuery()
            dbConnection.Close()
            lblSeta5.Visible = True
            lblPasso6.Enabled = True
            btnExibirDados.Enabled = True
            MessageBox.Show("Tabela populada com sucesso.",
                "Status da Adição de Dadaos",
                MessageBoxButtons.OK, MessageBoxIcon.Information)
        Catch sqlExc As SqlException
            MessageBox.Show(sqlExc.ToString, "Erro SQL Exception!",
                MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
#End Region

Executamos a stored procedure AdicionaContatos criada que vai preencher a tabela Contato com dados da tabela Employees do Northwind.

Exibindo os dados no DataGridView

#Region "Exibir Dados"
    ' Pega as informações a partir da tabela Contato e poe no DataSet que usado para se vincular o DataGridView
    Private Sub btnExibirDados_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExibirDados.Click
        If IsNothing(dgvDados.DataSource) Then
            Me.Height = 650
            Dim strSQL As String = _
                "USE TesteDB" & vbCrLf & _
                "SELECT * " & _
                "FROM GetContatos"
            Try
                Dim dbConnection As New SqlConnection(connectionString)
                Dim cmd As New SqlCommand(strSQL, dbConnection)
                ' O SqlDataAdapter usa o objeto SqlCommand para preencher o DataSet
                Dim da As New SqlDataAdapter(cmd)
                Dim dsContatos As New DataSet()
                da.Fill(dsContatos, "Contato")

                 'configura o datagridview definindo as cores de fundo e frente, a fonte, e outros recursos
                With Me.dgvDados
                    .Visible = True
                    .AutoGenerateColumns = False
                    .AlternatingRowsDefaultCellStyle.BackColor = Color.Lavender
                    .BackColor = Color.WhiteSmoke
                    .ForeColor = Color.MidnightBlue
                    .CellBorderStyle = DataGridViewCellBorderStyle.None
                    .ColumnHeadersDefaultCellStyle.Font = New Font("Tahoma", 8.0!, FontStyle.Bold)
                    .ColumnHeadersDefaultCellStyle.BackColor = Color.MidnightBlue
                    .ColumnHeadersDefaultCellStyle.ForeColor = Color.WhiteSmoke
                    .DefaultCellStyle.ForeColor = Color.MidnightBlue
                    .DefaultCellStyle.BackColor = Color.WhiteSmoke
                End With
                'define as colunas no grid
                Me.dgvDados.DataSource = dsContatos.Tables(0)
                Dim newColumn As Integer = Me.dgvDados.Columns.Add("ContatoID", "Contato ID")
                Me.dgvDados.Columns(newColumn).DataPropertyName = "ContatoID"
                newColumn = Me.dgvDados.Columns.Add("Nome", "Nome")
                Me.dgvDados.Columns(newColumn).DataPropertyName = "Nome"
                newColumn = Me.dgvDados.Columns.Add("Sobrenome", "Sobrenome")
                Me.dgvDados.Columns(newColumn).DataPropertyName = "Sobrenome"
                newColumn = Me.dgvDados.Columns.Add("Endereco", "Endereço")
                Me.dgvDados.Columns(newColumn).DataPropertyName = "Endereco"
            Catch sqlExc As SqlException
                MessageBox.Show(sqlExc.ToString, "Erro SQL Exception!",
                    MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End If
    End Sub
#End Region

Encerrar Programa

#Region "Encerra Programa"
    Private Sub exitToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles exitToolStripMenuItem.Click
        Me.Close()
    End Sub
#End Region

Executando o projeto iremos obter o seguinte resultado:

Neste projeto usamos instruções SQL para criar os objetos do banco de dados SQL Server. Vimos que é possível fazer isso via código.

Embora o projeto funcione ele possui grandes limitações que você poderá corrigir e melhorar:

Pegue o codigo completo aqui : CriarBancoDados.zip

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

 


            Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti