VB.NET - Trocando o banco de dados sem fechar a conexão


Você pode trocar o banco de dados em uso pela conexão atual sem precisar fechar a conexão. Sabia ???

Você faz isto usando o método ChangeDatabase().

O método ChangeDatabase() esta definido na interface IDbConnection que representa uma conexão para uma fonte de dados e esta implementada pelo provedores de dados .NET para banco de dados relacionais como SQL Server , Oracle e OLE DB.

O método é usado para trocar o banco de dados atual para uma conexão aberta. Sua utilização requer somente um parâmetro : o nome do banco de dados que você deseja usar no lugar do banco de dados atual.

A propriedade DataBase do objeto connection pode ser usada para verificar o banco de dados em uso pois é atualizada dinamicamente e retorna o nome do banco de dados para a conexão aberta . Ao fechar a conexão após chamar o método ChangeDatabase() o banco de dados será a ser usado na próxima conexão será o banco de dados usado na string de conexão original.

Para este artigo vou usar o servidor MSDE onde tenho os banco de dados : Teste e Macoratti.

Inicialmente a string de conexão será definida para realizar a conexão com o MSDE e usar o banco de dados Testes.

Em seguida vou trocar o banco de dados para Macoratti e exibir os dados da tabela Links (só para provar que o BD foi trocado).

Ao fechar a conexão o banco de dados Teste , que foi definido na conexão inicial,  volta a ser usado se eu abrir novamente a conexão.

O resultado destas operações é exibido em uma caixa de texto multiline usando o objeto StringBuilder.

Para exibir as propriedades do estado da conexão e do banco de dados usei as propriedades State e Database do objeto Connection.

Inicie um novo projeto no VS.NET e no formulário padrão insira os componentes conforme figura abaixo:

 

Defina os seguintes namespaces no projeto:

Imports System.Data.SqlClient
Imports System.Text

No início do formulário vamos definir as seguintes variáveis:

Dim conexao As String
Dim ds As DataSet
Dim da As SqlDataAdapter
Dim resultado As New StringBuilder
Dim conn As SqlConnection

No evento Load do formulário temos o código que define a string de conexão atual e abre a conexão:

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'string de conexao
        conexao = "integrated security=SSPI;data source=MACORATTI\VSDOTNET;persist security info=True;initial catalog=Teste"
        ' cria uma conexao com o MSDE
        conn = New SqlConnection(conexao)
        ' abre a conexao
        conn.Open()
 End Sub

No evento Click do botão de comando - Trocar Banco de dados - insira o código a seguir:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        resultado.Append(("String de conexao : " & Environment.NewLine))
        resultado.Append((conn.ConnectionString & Environment.NewLine & Environment.NewLine))
        resultado.Append(("Estado da conexao (Aberta) : " & conn.State & Environment.NewLine))
        resultado.Append(("Banco de dados  Inicial  : " & conn.Database & Environment.NewLine))
        ' muda o banco de dados 
        conn.ChangeDatabase("Macoratti")
        resultado.Append("Trocando o banco de dados..." & Environment.NewLine & Environment.NewLine)
        resultado.Append(("Novo Banco de dados    : " & conn.Database & Environment.NewLine & Environment.NewLine))
        resultado.Append("Exibindo dados da tabela Links." & Environment.NewLine & Environment.NewLine)
        'Cria um objeto SqlDataAdapter
        da = New SqlDataAdapter("Select * from Links", conn)
        '' Mapeia a tabela Clientes
        da.TableMappings.Add("Table", "Links")
        '' Preenche o dataset
        Dim ds = New DataSet
        Try
            da.Fill(ds)
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical)
        End Try
        ' Vincula o dataset ao datagrid
        dg.SetDataBinding(ds, "Links")
        txtResultado.Text = resultado.ToString()
    End Sub

No evento Click do botão - Fechar a conexão - insira o código abaixo:

 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        ' fecha a conexao e exibe o banco de dados que será usado na próxima abertura da conexao
        conn.Close()
        resultado.Append(("Estado da conexão (Fechada) : " & conn.State & Environment.NewLine))
        resultado.Append(("Banco de dados a ser usado na próxima conexão : " & conn.Database))
        txtResultado.Text = resultado.ToString()
End Sub

Executando o projeto para exemplo acima teremos:

Creio que não sejam necessárias mais explicações.

Até o próximo artigo ...


José Carlos Macoratti