ERRO AO EXCLUIR E RESTAURAR BANCO
Tenho uma aplicação em vb.net e nela eu faço backup de um banco de dados e depois, se quiser restaurá-lo, clicando em um botão, o banco em uso deve ser excluÃdo e depois restaurado atraves do arquivo .bak.
Porém, quando clico no botão, ele me retorna um erro dizendo que o banco está em uso e por isso não pode excluÃ-lo para depois restaurá-lo.
Segue abaixo o código do botão
Lembrando que todo SQL.STRINGCON2 é a minha string de conexão, que é :
Public stringcon2 As String = [Ô]Password=etesp;Persist Security Info=True;User ID=sa;Initial Catalog=master[Ô]
código do botão \/
[ô]define a conexão
Dim cn As New SqlConnection()
cn.ConnectionString = sql.stringcon2
[ô]define comando
Dim cmd As New SqlCommand()
Dim cmd2 As New SqlCommand()
[ô]associar comando à conexão
cmd.Connection = cn
cmd2.Connection = cn
[ô]define instrucao SQL
Dim instrucaosql As String = String.Format([Ô]Drop database LIVRARIA_BETEL[Ô])
Dim instrucaosql2 As String = String.Format([Ô]use master[Ô])
[ô]passar instrucao para o comando
cmd.CommandText = instrucaosql
cmd2.CommandText = instrucaosql2
[ô]especifica o tipo de comando
cmd.CommandType = CommandType.Text
cmd2.CommandType = CommandType.Text
Try
cn.Open()
cn.ChangeDatabase([Ô]master[Ô])
cmd2.ExecuteNonQuery()
cmd.ExecuteNonQuery()
MsgBox([Ô]Banco de dados LIVRARIA_BETEL excluÃdo com sucesso...[Ô], MsgBoxStyle.Information)
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
Finally
[ô] fecha a conexao
cn.Close()
End Try
Dim sqlUtils As New SQLServer
Dim dir As String
dir = My.Application.Info.DirectoryPath
Dim conexaoSQLServer As String = sql.stringcon2
Try
sqlUtils.RestauraDatabase(conexaoSQLServer, [Ô]LIVRARIA_BETEL[Ô], dir & [Ô]\BackupLivrariaBetel.bak[Ô])
MsgBox([Ô]RESTAURAÇÃO DO BANCO DE DADOS LIVRARIA_BETEL EFETUADA COM SUCESSO ![Ô])
Dim source As String = [Ô]Restauração do Banco de Dados realizado por: [Ô]
Dim source2 As String = [Ô]Administrador - em [Ô] & Today & [Ô] as [Ô] & TimeOfDay
[ô] Encripta a string
Dim result As String = Crypto.Encrypt(source)
Dim result2 As String = Crypto.Encrypt(source2)
Dim fluxoTexto As IO.StreamWriter
If IO.File.Exists(dir & [Ô]\LogRestauracaoBD.txt[Ô]) Then
fluxoTexto = New IO.StreamWriter(dir & [Ô]\LogRestauracaoBD.txt[Ô], True)
fluxoTexto.WriteLine(result2)
fluxoTexto.Close()
Else
Dim objStream As New System.IO.FileStream(dir & [Ô]\LogRestauracaoBD.txt[Ô], IO.FileMode.OpenOrCreate)
Dim Arq As New System.IO.StreamWriter(objStream)
Arq.WriteLine(result)
Arq.WriteLine(result2)
Arq.Close()
End If
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
CÓDIGO DA FUNCAO RESTAURA BD EM OUTRA CLASSE
Function RestauraDatabase(ByVal connString As String, ByVal nomeDB As String, ByVal backupFile As String)
Dim cn As New SqlConnection(connString)
Try
[ô]comando para restaurar o banco de dados
Dim cmdBackup As New SqlCommand([Ô]RESTORE DATABASE [[Ô] & nomeDB & [Ô]] FROM DISK = [ô][Ô] & backupFile & [Ô][ô][Ô], cn)
cn.Open()
cmdBackup.ExecuteNonQuery()
Finally
cn.Close()
End Try
End Function
O QUE POSSO FAZER PARA RESOLVER?
Porém, quando clico no botão, ele me retorna um erro dizendo que o banco está em uso e por isso não pode excluÃ-lo para depois restaurá-lo.
Segue abaixo o código do botão
Lembrando que todo SQL.STRINGCON2 é a minha string de conexão, que é :
Public stringcon2 As String = [Ô]Password=etesp;Persist Security Info=True;User ID=sa;Initial Catalog=master[Ô]
código do botão \/
[ô]define a conexão
Dim cn As New SqlConnection()
cn.ConnectionString = sql.stringcon2
[ô]define comando
Dim cmd As New SqlCommand()
Dim cmd2 As New SqlCommand()
[ô]associar comando à conexão
cmd.Connection = cn
cmd2.Connection = cn
[ô]define instrucao SQL
Dim instrucaosql As String = String.Format([Ô]Drop database LIVRARIA_BETEL[Ô])
Dim instrucaosql2 As String = String.Format([Ô]use master[Ô])
[ô]passar instrucao para o comando
cmd.CommandText = instrucaosql
cmd2.CommandText = instrucaosql2
[ô]especifica o tipo de comando
cmd.CommandType = CommandType.Text
cmd2.CommandType = CommandType.Text
Try
cn.Open()
cn.ChangeDatabase([Ô]master[Ô])
cmd2.ExecuteNonQuery()
cmd.ExecuteNonQuery()
MsgBox([Ô]Banco de dados LIVRARIA_BETEL excluÃdo com sucesso...[Ô], MsgBoxStyle.Information)
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
Finally
[ô] fecha a conexao
cn.Close()
End Try
Dim sqlUtils As New SQLServer
Dim dir As String
dir = My.Application.Info.DirectoryPath
Dim conexaoSQLServer As String = sql.stringcon2
Try
sqlUtils.RestauraDatabase(conexaoSQLServer, [Ô]LIVRARIA_BETEL[Ô], dir & [Ô]\BackupLivrariaBetel.bak[Ô])
MsgBox([Ô]RESTAURAÇÃO DO BANCO DE DADOS LIVRARIA_BETEL EFETUADA COM SUCESSO ![Ô])
Dim source As String = [Ô]Restauração do Banco de Dados realizado por: [Ô]
Dim source2 As String = [Ô]Administrador - em [Ô] & Today & [Ô] as [Ô] & TimeOfDay
[ô] Encripta a string
Dim result As String = Crypto.Encrypt(source)
Dim result2 As String = Crypto.Encrypt(source2)
Dim fluxoTexto As IO.StreamWriter
If IO.File.Exists(dir & [Ô]\LogRestauracaoBD.txt[Ô]) Then
fluxoTexto = New IO.StreamWriter(dir & [Ô]\LogRestauracaoBD.txt[Ô], True)
fluxoTexto.WriteLine(result2)
fluxoTexto.Close()
Else
Dim objStream As New System.IO.FileStream(dir & [Ô]\LogRestauracaoBD.txt[Ô], IO.FileMode.OpenOrCreate)
Dim Arq As New System.IO.StreamWriter(objStream)
Arq.WriteLine(result)
Arq.WriteLine(result2)
Arq.Close()
End If
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
CÓDIGO DA FUNCAO RESTAURA BD EM OUTRA CLASSE
Function RestauraDatabase(ByVal connString As String, ByVal nomeDB As String, ByVal backupFile As String)
Dim cn As New SqlConnection(connString)
Try
[ô]comando para restaurar o banco de dados
Dim cmdBackup As New SqlCommand([Ô]RESTORE DATABASE [[Ô] & nomeDB & [Ô]] FROM DISK = [ô][Ô] & backupFile & [Ô][ô][Ô], cn)
cn.Open()
cmdBackup.ExecuteNonQuery()
Finally
cn.Close()
End Try
End Function
O QUE POSSO FAZER PARA RESOLVER?
Antes de excluir o catálogo, você precisa se certificar que nenhuma conexão, incluindo a da sua aplicação, possua o Initial Catalog apontando para esse catálogo.
Além disso, as credenciais de acesso devem ser de um usuário com privilégios DBA independente da máquina local, assim, preferencialmente não utilize o [Ô]sa[Ô], que na verdade é um login vinculado á estação e não um user. Crie um user com os privilégios adequados para o fim á que se destina.
Além disso, as credenciais de acesso devem ser de um usuário com privilégios DBA independente da máquina local, assim, preferencialmente não utilize o [Ô]sa[Ô], que na verdade é um login vinculado á estação e não um user. Crie um user com os privilégios adequados para o fim á que se destina.
concorda comigo que esse tipo de transação quem deve fazer é o administrador do banco (DBA) e não um usuario,pense na logica,
tenho varias maquinas que estao consentradas em uma maquina(servidor) daria para fazer backup e restore de database remotamente? não! entao o melhor é vc criar uma Procedure e junto com ela uma JOB para executar a procedure a cada tempo previsto isso é se vc usa SGBD.
tenho varias maquinas que estao consentradas em uma maquina(servidor) daria para fazer backup e restore de database remotamente? não! entao o melhor é vc criar uma Procedure e junto com ela uma JOB para executar a procedure a cada tempo previsto isso é se vc usa SGBD.
Tópico encerrado , respostas não são mais permitidas