VB .NET -  Criando banco de dados e tabelas no SQL Server via código


 Neste artigo vou mostrar como podemos criar um banco de dados, tabelas e realizar outras operações no SQL Server via código usando a linguagem VB .NET.

Desde os tempos do Visual Basic 6 eu publico artigos sobre como criar banco de dados e tabelas bem como realizar outras operações com o SQL Server e outros bancos de dados.

Basta você googar 'Macoratti criar banco de dados' que vai encontrar muitas referências.

Volto portanto ao assunto desta vez usando o Visual Studio 2015 Community mostrando como criar um banco de dados SQL Server, uma tabela e realizar outras operações simples de forma a recordar alguns conceitos da ADO .NET e dos comandos SQL usados nesta abordagem.

É um artigo prático, e vamos realizar as seguintes operações:

então vamos ao que interessa...

Recursos Usados

Criando o projeto Windows Forms

Abra o VS 2015 Community e crie um novo projeto (File-> New Project) usando a linguagem C# e o template Windows Forms Application.

Informe um nome a seu gosto. Eu vou usar o nome Vbnet_CriarDB;

Selecione o formulário Form1.vb e partir da ToolBox inclua os seguintes controles:

Disponha os controles conforme o leiaute da figura abaixo:

A seguir declare os seguintes namespaces no formulário:

Imports System.Data.SqlClient
Imports Microsoft.Win32

Após a declaração do formulário inclua o código a seguir onde definimos as variáveis usadas no formulário:

Private ConnectionString As String = ""
Private rdr As SqlDataReader = Nothing
Private con As SqlConnection = Nothing
Private cmd As SqlCommand = Nothing
Private da As SqlDataAdapter = Nothing

1- Verificando se existe uma instância do SQL Server na máquina local

No evento Click do botão de comando -  Verificar SQL Server - inclua o código abaixo:

 Private Sub btnVerificarSQLServer_Click(sender As Object, e As EventArgs) Handles btnVerificarSQLServer.Click
        Dim registroView As RegistryView = If(Environment.Is64BitOperatingSystem, RegistryView.Registry64, RegistryView.Registry32)

        Using chaveRegistroLocalMachine As RegistryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registroView)

            Dim instanciaChave As RegistryKey = chaveRegistroLocalMachine.OpenSubKey("SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL", False)

            lbDados.Items.Add("Nome da máquina\Nome da Instância")
            If instanciaChave IsNot Nothing Then
                For Each nomeInstancia In instanciaChave.GetValueNames()
                    lbDados.Items.Add(Environment.MachineName + "\" + nomeInstancia)
                Next
            Else
                MessageBox.Show("SQL Server e instâncias não localizados")
            End If
        End Using

    End Sub

Neste código estamos verificando as instâncias do SQL Server armazenadas no registro do Windows. Atente para fato que dependendo da versão do seu sistema operacional o registro pode estar armazenado em outra chave do registro.

Existe uma outra abordagem cujo código é mostrado a seguir, mas ela é mais demorada e mais propensa a erros:

        'Podemos usar essa abordagem mas é mais demorada e mais sujeita a erros
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        Dim sqldatasourceenumerator1 As SqlDataSourceEnumerator = SqlDataSourceEnumerator.Instance
        Dim datatable1 As DataTable = sqldatasourceenumerator1.GetDataSources()
        For Each row As DataRow In datatable1.Rows
            lbDados.Items.Add("****************************************")
            lbDados.Items.Add("Server Name:" + row("ServerName"))
            lbDados.Items.Add("Instance Name:" + row("InstanceName"))
            lbDados.Items.Add("Is Clustered:" + row("IsClustered"))
            lbDados.Items.Add("Version:" + row("Version"))
            lbDados.Items.Add("****************************************")
        Next

2- Criando um banco de dados no SQL Server

Agora no evento Click do botão - Criar Banco de dados  - inclua o código abaixo:

     Private Sub btnCriarBDSQLServer_Click(sender As Object, e As EventArgs) Handles btnCriarBDSQLServer.Click
        'Para criar um banco de dados inicial devemos definir Initial Catalog como Master
        ' Defina a string de conexão com o SQL Server : "Data Source=;" + "Initial Catalog=;" + "Integrated Security=I;"
        ConnectionString = MontaStringConexaoSQLServer("Master")
        ' cria e inicializa a string de conexão
        Dim minhaConexaoSQLServer As SqlConnection = New SqlConnection(ConnectionString)
        ' define uma string para armazenar a consulta SQL que vai criar o BD
        Dim sql As String = "CREATE database " & txtNomeBD.Text
        ' cria o comando para execução na conexão atual
        Dim cmd As SqlCommand = New SqlCommand(sql, minhaConexaoSQLServer)
        Try
            cmd.Connection.Open()  'abre a conecao com o cmd
            cmd.ExecuteNonQuery()  'Executa a consulta
            lbDados.Items.Add("O banco de dados " & txtNomeBD.Text & " foi criado com sucesso.")
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Erro")
        Finally
            cmd.Connection.Close() 'Fecha a conexão
        End Try
    End Sub

Como o código ja esta comentado vou acrescentar as seguintes informações:

- A string de conexão usada esta no formato :  "Data Source=;" + "Initial Catalog=;" + "Integrated Security=;"

- Como vamos criar um banco de dados novo estamos usando a instância 'Master' do SQL Server no método MontaStringConexaoSQLServer()

- O método  MontaStringConexaoSQLServer() vai usar as informações fornecidas pelo usuário para o DataSource, o banco de dados, que pode ser Master ou o nome informado, e o valor true ou false da combobox cboIntegrateSecurity.

- A instrução SQL usada para criar o banco de dados é :  CREATE database nome_do_banco_dados

Abaixo vemos o código deste método:

 Private Function MontaStringConexaoSQLServer(ByVal flag As String) As String
        Dim dataSource As String = ""
        Dim initialCatalog As String = ""
        Dim integratedSecurity As Boolean = False
        Dim connectionString As String = ""
        If Not String.IsNullOrWhiteSpace(txtDataSource.Text) Then
            dataSource = txtDataSource.Text
        Else
            MessageBox.Show("Informe o DataSource...")
            Return ""
        End If
        If Not String.IsNullOrWhiteSpace(txtInitialCatalog.Text) Then
            If flag = "Master" Then
                initialCatalog = txtInitialCatalog.Text
            ElseIf flag = "Tabela" Then
                initialCatalog = txtNomeBD.Text
            End If
        Else
                MessageBox.Show("Informe o Initial Catalog...")
            Return ""
        End If
        If cboIntegrateSecurity.Text = "true" Then
            integratedSecurity = True
        ElseIf cboIntegrateSecurity.Text = "false" Then
            integratedSecurity = False
        Else
            MessageBox.Show("Informe o Integrated Security...")
            Return ""
        End If
        connectionString = "Data Source=" & dataSource & ";Initial Catalog=" & initialCatalog & ";Integrated Security=" & integratedSecurity
        Return connectionString
    End Function

3- Criando uma tabela no banco de dados

Agora no evento Click do botão - Criar uma tabela no Banco de dados  - inclua o código abaixo:

 Private Sub btnCriarTabela_Click(sender As Object, e As EventArgs) Handles btnCriarTabela.Click
        'define a string de conexão com a banco de dados que foi criado
        ConnectionString = MontaStringConexaoSQLServer("Tabela")
        Try
            'cria e inicializa a string de conexão
            Dim cn As SqlConnection = New SqlConnection(ConnectionString)

            'define a consulta SQL para criar a tabela com os campos :  ID, Nome e Email
            Dim sql As String = "CREATE TABLE " & txtNomeTabela.Text & "(ID int NOT NULL, 
                                                                          Nome varchar(50) NULL,
                                                                          Email varchar(150) NULL)"

            'cria comando na conexão para executar a consulta
            cmd = New SqlCommand(sql, cn)
            'abre a conexao
            cmd.Connection.Open()
            'executa o comando
            cmd.ExecuteNonQuery()

            ' adicina um registro na tabela
            sql = "INSERT INTO " & txtNomeTabela.Text & "(ID, Nome, Email) " + "VALUES (1001, 'Macoratti', 'macoratti@yahoo.com' ) "
            cmd = New SqlCommand(sql, cn)
            cmd.ExecuteNonQuery()
            lbDados.Items.Add("A tabela " & txtNomeTabela.Text & " foi criada com sucesso.")

            'lista as tabelas existentes no banco de dados para a conexão atual
            ListaTabelas(GetTabelasBancoDados(ConnectionString))
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Erro")
        Finally
            cmd.Connection.Close()
        End Try
    End Sub

Neste código vale a pena comentar que :

-  Para criar a tabela estamos usando o seguinte comando SQL :

 "CREATE TABLE " & txtNomeTabela.Text & "(ID int NOT NULL,
                                                                          Nome varchar(50) NULL,
                                                                          Email varchar(150) NULL)"


Note que informamos os nomes dos campos que desejamos criar, o seu tipo e a indicação se o mesmo é null ou não.

Para incluir um registro no banco de dados usamos a instrução SQL :

"INSERT INTO " & txtNomeTabela.Text & "(ID, Nome, Email) " + "VALUES (1001, 'Macoratti', 'macoratti@yahoo.com' )

Onde informamos os nomes dos campos e seus valores.

Para exibir as tabelas do banco de dados chamamos o método ListaTabelas() onde passamos o método GetTabelasBancoDados().

O método GetTabelasBancoDados() vai retornar uma lista de strings contendo os nomes das tabelas existentes conforme mostra o código a seguir:

    Private Function GetTabelasBancoDados(ByVal conexaoSQLServer As String) As List(Of String)
        'define as variáveis usadas 
        Dim lista_Tabelas As New List(Of String)
        Dim cn As SqlConnection
        Dim cmd As SqlDataAdapter
        Dim ds As New DataSet()
        'faz a conexão com o banco de dados e abre a conexao
        cn = New SqlConnection(conexaoSQLServer) '
        cn.Open()
        'define a consulta para retornar as tabelas
        cmd = New SqlDataAdapter("SELECT * FROM INFORMATION_SCHEMA.tables ORDER BY TABLE_NAME", cn)
        'preenche o dataset
        cmd.Fill(ds)
        'fecha a conexao
        cn.Close()
        For Each table As DataTable In ds.Tables
            For Each row As DataRow In table.Rows
                'Pega somente as tabelas e emite as Views
                If row.ItemArray(3).ToString = "BASE TABLE" Then
                    For Each col As DataColumn In table.Columns
                        If col.ToString() = "TABLE_NAME" Then
                            lista_Tabelas.Add(row(col).ToString())
                            Exit For
                        End If
                    Next
                End If
            Next
        Next
        'retorna uma lista de strings contendo as tabelas do BD
        Return lista_Tabelas
    End Function

Neste código usamos usando a instrução :

SELECT * FROM INFORMATION_SCHEMA.tables ORDER BY TABLE_NAME

Para retornar as tabelas existentes.

O método ListaTabelas() vai receber a lista de strings contendo o nome das tabelas e vai usar um laço For Each para exibir as tabelas:

    Private Sub ListaTabelas(ByVal nomes As List(Of String))
        lbDados.Items.Add("Tabelas do banco de dados")
        For Each nome In nomes
            lbDados.Items.Add(nome)
        Next
    End Sub

4- Lista as tabelas do banco de dados

Agora no evento Click do botão - Lista Tabelas - inclua o código abaixo:

    Private Sub btnListaTabelas_Click(sender As Object, e As EventArgs) Handles btnListaTabelas.Click
        'cria e inicializa uma string de conexão
        ConnectionString = MontaStringConexaoSQLServer("Tabela")
        Try
            ListaTabelas(GetTabelasBancoDados(ConnectionString))
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Erro")
        End Try
    End Sub

Este código apenas vai listar as tabelas existentes.

5- Apagar uma tabela do banco de dados

Agora no evento Click do botão - Apagar tabela - inclua o código abaixo:

 Private Sub btnApagarTabela_Click(sender As Object, e As EventArgs) Handles btnApagarTabela.Click
        'define a string de conexão com a banco de dados que foi criado
        ConnectionString = MontaStringConexaoSQLServer("Tabela")
        Try
            'cria e inicializa a string de conexão
            Dim cn As SqlConnection = New SqlConnection(ConnectionString)
            'define a consulta SQL para excluir a tabela
            Dim sql As String = "DROP TABLE " & txtNomeTabela.Text
            'cria comando na conexão para executar a consulta
            cmd = New SqlCommand(sql, cn)
            'abre a conexao
            cmd.Connection.Open()
            'executa o comando
            cmd.ExecuteNonQuery()
            lbDados.Items.Add("A tabela " & txtNomeTabela.Text & " foi excluída com sucesso.")
            'lista as tabelas existentes no banco de dados para a conexão atual
            ListaTabelas(GetTabelasBancoDados(ConnectionString))
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Erro")
        Finally
            cmd.Connection.Close()
        End Try
    End Sub

Neste código estamos usando a instrução SQL : DROP TABLE para excluir a tabela informada em txtNomeTabela.Text.

6- Exibir os registros da tabela

Agora no evento Click do botão - Exibir dados da tabela - inclua o código abaixo:

   Private Sub btnExibirDados_Click(sender As Object, e As EventArgs) Handles btnExibirDados.Click
        ExibirDadosTabela()
    End Sub
  Private Sub ExibirDadosTabela()
        'define a string de conexão com a banco de dados que foi criado
        ConnectionString = MontaStringConexaoSQLServer("Tabela")
        Try
            'cria e inicializa a string de conexão
            Dim cn As SqlConnection = New SqlConnection(ConnectionString)
            'define a consulta SQL selecionar os dados da tabela
            Dim sql As String = "SELECT * FROM " & txtNomeTabela.Text
            'cria comando na conexão para executar a consulta
            cmd = New SqlCommand(sql, cn)
            'define um dataadatper
            da = New SqlDataAdapter(cmd)
            Dim ds As New DataSet()
            da.Fill(ds, "tabela")
            lbDados.Items.Add("Dados da tabela " & txtNomeTabela.Text)
            Dim dr As DataRow
            For Each dr In ds.Tables(0).Rows
                Dim i As Integer
                For i = 1 To ds.Tables(0).Columns.Count
                    lbDados.Items.Add(dr(i - 1))
                Next i
            Next

        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Erro")
        Finally
            cmd.Connection.Close()
        End Try
    End Sub

Neste código usamos a instrução SQL : SELECT * FROM para selecionar todos os dados da tabela informada em txtNomeTabela.Text.

Usamos um DataSet para preencher em memória os dados obtidos e usamos um laço For Each para percorrer a tabela e exibir os registros.

Rodando o projeto e executando as operações iremos obter o seguinte resultado:

Eu procurei utilizar uma abordagem bem simples para facilitar o entendimento de quem esta começando agora com o VB .NET. Mas você pode melhorar o código criando uma classe para realizar essas operações e separar as resposabilidades removendo do formulário todo o código de acesso a dados segundo manda as boas práticas.

Pegue o projeto completo aqui :  Vbnet_CriarDB.zip

(Disse Jesus) :  Passará o céu e a terra, mas as minhas palavras não hão de passar. Lucas 21:33

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 ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti