VB.NET 2005  -  Verificar se uma tabela existe no SQL Server


Como saber se uma determinada tabela existe no SQL Server ?  Creio que a melhor forma de responder esta pergunta é mostrar como obter o resultado esperado com um exemplo usando o VB 2005 e SQL Server 2005 ambos da versão Express Edition.

Eu vou usar o banco de dados Cadastro.mdf que foi criado no SQL Server 2005. Para detalhes sobre o assunto acompanhe  o artigo : VB.NET  2005 -  Criando Objetos Básicos de dados.  Esta base de dados possui duas tabelas : Clientes e Estados.

Crie um novo projeto no VB2005 chamado tabelaExisteNet e no formulário padrão inclua um componente DataGridView , um componente Button, dois Labels e um TextBox, conforme figura abaixo:

A string de conexão com o banco de dados usada será armazenada usando o recurso My.Settings conforme os seguintes passos:

  1. Clique com o botão direito sobre My Project na janela Solution Explorer e selecione Open.
  2. Na janela a seguir selecione Settings e informe um nome para a string de conexão e para a string SQL na coluna Name. Eu usei os nomes connSQL. Salve a operação. Pronto ! já podemos recuperar esta informação a partir de My.Settings em tempo de execução.

iremos usar o seguinte namespace no projeto :  Imports System.Data.SqlClient

No evento Click do botão de comando insira o código abaixo:

  Private Sub btnVerifica_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnVerifica.Click

        Dim conCadastro As SqlConnection = New SqlConnection(My.Settings.connSQL)

        If Not (txtNomeTabela.Text = String.Empty) Then
            If existeTabela(conCadastro, txtNomeTabela.Text) = False Then
                MessageBox.Show("Não existe a tabela indica, verifique...", "Tabela não Existe", _ 
                                             MessageBoxButtons.OK, MessageBoxIcon.Stop)
                Exit Sub
            Else
                Dim strSql As String = "SELECT * FROM " & txtNomeTabela.Text
                Dim da As New SqlDataAdapter(strSql, conCadastro)
                Dim tabela As New DataTable

                da.Fill(tabela)
                dgvTabela.DataSource = tabela
            End If
        else
              MsgBox("Nome da tabela inválido...", MsgBoxStyle.Critical, "Nome Inválido")
        End If
    End Sub

No código acima estamos usando a função existeTabela para verificar se a tabela informada realmente existe no banco de dados Cadastro.mdf. O código da função é dado abaixo:

Private Function existeTabela(ByVal conexaoSQL As SqlConnection, ByVal nomeTabela As String) As Boolean

        Dim tabela As New DataTable
        Dim criterioSQL As String
        criterioSQL = "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' ORDER BY TABLE_TYPE"
        Try
            Dim da As New SqlDataAdapter(criterioSQL, conexaoSQL)
            da.Fill(tabela)

            For Each dr As DataRow In tabela.Rows
                If dr("TABLE_NAME").ToString = nomeTabela Then
                    Return True
                End If
            Next
            Return False
        Catch ex As Exception
            MessageBox.Show("ERRO " & ex.Message, "Verifica tabela")
            Return False
        End Try
    End Function

Abaixo temos o resultado da execução do projeto para os dois casos possíveis:

A tabela Estados existe e é exibida no DataGridView A tabela Teste não existe na base de dados

Uma variação desta função seria preencher um combobox com os nomes das tabelas existentes na base de dados. Para obter tal resultado vou criar a função listaTabelas() que retorna um ArrayList com os nomes das tabelas existentes. Veja abaixo o código:

Private Function listaTabela(ByVal conexaoSQL As SqlConnection, ByVal nomeTabela As String) As ArrayList
        Dim tabela As New DataTable
        Dim criterioSQL As String
        Dim tabelas As New ArrayList
        criterioSQL = "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' ORDER BY TABLE_TYPE"
        Try
            Dim da As New SqlDataAdapter(criterioSQL, conexaoSQL)
            da.Fill(tabela)
            For Each dr As DataRow In tabela.Rows
                tabelas.Add(dr("TABLE_NAME").ToString)
            Next
        Catch ex As Exception
            MessageBox.Show("ERRO " & ex.Message, "Existe tabela")
        End Try
        Return tabelas
    End Function

Inclua uma combobox e um novo controle Button no formulário e no evento Click deste segundo botão de comando inclua o seguinte código:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim retorno As ArrayList
Dim conCadastro As SqlConnection = New SqlConnection(My.Settings.connSQL)

If Not (txtNomeTabela.Text = String.Empty) Then

     retorno = listaTabela(conCadastro, txtNomeTabela.Text)
     If retorno.Count > 0 Then
            ComboBox1.DataSource = retorno
            ComboBox1.SelectedIndex = 0
     End If
End If
End Sub

Executando o projeto e clicando neste segundo botão obtemos:

Pegue o código completo do projeto aqui : tabelaExisteNet.zip (sem o banco de dados)

Bom estudo e até o próximo artigo .NET


José Carlos Macoratti