12 08 2015
Backup e restauração de bancos de dados SQL Server pelo C#
Uma dúvida frequente que aparece quando utilizamos o SQL Server como banco de dados nas nossas aplicações é: como fazer o backup e restauração do banco de dados através da própria aplicação? Essa questão surge principalmente quando a aplicação não é tão grande e quando utilizamos o SQL Server Express, uma vez que, para aplicações maiores, você provavelmente controlará o backup e restauração através de Jobs no próprio SQL Server (ou um DBA tomará conta dessa tarefa). Após ter recebido de um inscrito uma questão relacionada a esse assunto, resolvi escrever um artigo mostrando um passo a passo do backup e restauração de bancos de dados SQL Server através do C#.
Conhecendo o SMO (SQL Server Management Objects)
A biblioteca “SQL Server Management Objects“, mais conhecida como SMO, contém uma coleção de classes que possibilitam a execução de tarefas gerenciais em bancos de dados SQL Server de maneira programática. Para ter uma ideia de todas as tarefas que podemos executar com essa biblioteca, confira a documentação no MSDN.
Como você já deve ter imaginado, uma das funções existentes no SMO é a criação e restauração de backups. Para utilizarmos a biblioteca do SMO em nossos projetos, temos que adicionar quatro referências:
– Microsoft.SqlServer.ConnectionInfo
– Microsoft.SqlServer.Management.Sdk.Sfc
– Microsoft.SqlServer.Smo
– Microsoft.SqlServer.SmoExtended
Você consegue encontrar essas referências na seção “Extensions” da janela de referências:
Uma vez adicionadas essas referências, conseguimos utilizar as classes do SMO para gerenciarmos instâncias do SQL Server. Acompanhe agora como podemos realizar o backup e restauração de bancos de dados SQL Server utilizando essa biblioteca.
Criando o projeto de exemplo
Para demonstrar as funcionalidades de backup e restauração através da biblioteca SMO, vamos construir uma interface bem simples em um projeto do tipo Windows Forms Application:
Como você pode notar, a interface possui dois TextBoxes (servidorTextBox e databaseTextBox) com os seus respectivos Labels, dois Buttons (backupButton e restauracaoButton) e um ComboBox (backupsComboBox). Preenchi inicialmente o TextBox do servidor com “.\SQLEXPRESS” (instância local do SQL Server Express) e o TextBox do banco de dados com “DemoDB” (um banco de dados de exemplo que eu tenho na minha instância local do SQL Server Express). Mais adiante neste artigo demonstrarei como carregar os nomes dos arquivos de backup no ComboBox.
Efetuando um backup
A primeira tarefa que eu quero demonstrar é a criação de um backup, que será o código executado ao clicarmos no botão “Backup“. Veja como fica o código desse botão:
private void backupButton_Click(object sender, EventArgs e) { var server = new Microsoft.SqlServer.Management.Smo.Server(servidorTextBox.Text); var backup = new Microsoft.SqlServer.Management.Smo.Backup(); backup.Database = databaseTextBox.Text; backup.Incremental = false; string nomeArquivoBackup = string.Format("{0}_{1:yyyyMMdd_HHmmss}.bak", databaseTextBox.Text, DateTime.Now); backup.Devices.AddDevice(nomeArquivoBackup, Microsoft.SqlServer.Management.Smo.DeviceType.File); backup.SqlBackup(server); MessageBox.Show(string.Format("Backup '{0}' concluído com sucesso.", nomeArquivoBackup), "Info", MessageBoxButtons.OK, MessageBoxIcon.Information); }
Como você pode perceber, a criação de um arquivo de backup é muito simples e o código fala por si só. Primeiramente criamos uma instância de Server passando o endereço do servidor. Feito isso, criamos uma instância de Backup, configuramos o nome do banco de dados (propriedade Database) e ajustamos a propriedade Incremental como false (para sempre fazermos um backup completo do banco de dados, e não um backup diferencial).
Logo em seguida, montamos uma estratégia para o nome do arquivo de backup (que nesse exemplo utilizei o nome do banco de dados seguido da data e hora completa) e adicionamos esse nome de arquivo como destino do backup (método AddDevice da propriedade Devices). Por fim, chamamos o método SqlBackup passando o servidor criado anteriormente.
Ao executarmos a aplicação e clicarmos no botão “Backup“, receberemos a mensagem que o backup foi realizado com sucesso. Além disso, conseguimos conferir que o backup foi criado corretamente na pasta “Backup” no diretório de instalação do SQL Server:
Carregando a lista de backups
Para conseguirmos restaurar um backup efetuado anteriormente, precisamos primeiramente de uma lista com os caminhos dos arquivos de backup. Apesar do SMO possuir alguns métodos que permitem a listagem dos backups efetuados por banco de dados, não é possível recuperarmos os caminhos dos arquivos através da biblioteca SMO. Dessa forma, a alternativa que nos resta é conectarmos no banco de dados e executarmos uma query utilizando as tabelas msdb.dbo.backupmediafamily e msdb.dbo.backupset. É possível conseguirmos uma lista de arquivos de backup através da seguinte query (onde “DemoDB” é o nome do banco de dados que queremos considerar):
SELECT physical_device_name FROM msdb.dbo.backupmediafamily INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id WHERE (msdb.dbo.backupset.database_name LIKE 'DemoDB')
Agora que sabemos como retornar uma lista com os caminhos dos arquivos de backup, podemos preencher o ComboBox do nosso projeto com essas informações. Faremos isso no evento DropDown do ComboBox, utilizando o seguinte código:
private void backupsComboBox_DropDown(object sender, EventArgs e) { using (var connection = new System.Data.SqlClient.SqlConnection(string.Format("Server={0};Database={1};Trusted_Connection=True;", servidorTextBox.Text, databaseTextBox.Text))) { connection.Open(); using (var command = new System.Data.SqlClient.SqlCommand( "SELECT physical_device_name FROM msdb.dbo.backupmediafamily " + "INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id " + "WHERE (msdb.dbo.backupset.database_name LIKE @DatabaseName)", connection)) { command.Parameters.AddWithValue("DatabaseName", databaseTextBox.Text); using (var reader = command.ExecuteReader()) { var table = new DataTable(); table.Load(reader); table.Columns.Add("FriendlyName"); foreach (DataRow row in table.Rows) { row["FriendlyName"] = System.IO.Path.GetFileName(row["physical_device_name"].ToString()); } if (backupsComboBox.DataSource != null && backupsComboBox.DataSource is DataTable) { var oldTable = ((DataTable)backupsComboBox.DataSource); backupsComboBox.DataSource = null; oldTable.Dispose(); } backupsComboBox.DataSource = table; backupsComboBox.DisplayMember = "FriendlyName"; backupsComboBox.ValueMember = "physical_device_name"; } } } }
O código acima executa a query apresentada anteriormente, armazenando o resultado em uma DataTable, que servirá de fonte de dados para o ComboBox. Além de carregar os dados na DataTable, criamos também uma coluna customizada contendo somente o nome do arquivo (e não o caminho completo). Dessa forma, podemos configurar a propriedade DisplayMember do ComboBox para que somente o nome do arquivo seja exibido, enquanto que a propriedade ValueMember (valor para quando acessamos a propriedade SelectedValue) conterá o caminho completo do arquivo.
Restaurando um backup
O processo de restauração de backups através da biblioteca SMO é tão simples quanto o processo de criação do backup. Nesse caso, ao invés de utilizarmos a classe Backup, utilizamos a classe Restore. Na instância que criamos dessa classe, temos que configurar a propriedade Database, que deve conter o nome do banco de dados a ser restaurado. Além disso, da mesma forma que fizemos no processo de backup, temos que adicionar o nome do arquivo através do método AddDevice. Finalmente, basta chamarmos o método KillAllProcesses passando o nome do banco de dados (para matarmos possíveis conexões que estejam abertas e que impossibilitariam a restauração do backup) e utilizarmos o método SqlRestore passando a instância de Server criada anteriormente.
Veja abaixo como fica o código completo do botão “Restauração“:
private void restauracaoButton_Click(object sender, EventArgs e) { var server = new Microsoft.SqlServer.Management.Smo.Server(servidorTextBox.Text); var restore = new Microsoft.SqlServer.Management.Smo.Restore(); restore.Database = databaseTextBox.Text; restore.Devices.AddDevice(backupsComboBox.SelectedValue.ToString(), Microsoft.SqlServer.Management.Smo.DeviceType.File); server.KillAllProcesses(databaseTextBox.Text); restore.SqlRestore(server); MessageBox.Show(string.Format("Backup '{0}' restaurado com sucesso.", backupsComboBox.Text), "Info", MessageBoxButtons.OK, MessageBoxIcon.Information); }
Execute o exemplo, escolha um dos backups disponíveis e veja que o backup é restaurado com sucesso:
Backup e restauração assíncronos
Os métodos SqlBackup e SqlRestore apresentados anteriormente têm também as suas versões assíncronas. Porém, não vá pensando que eles foram implementados utilizando as palavras reservadas async e await como estamos acostumados ultimamente. Ao chamarmos os métodos SqlBackupAsync ou SqlRestoreAsync, o processo de backup ou restauração será iniciado e o controle será retornado à próxima linha de código. Entretanto, se algum erro acontecer, você não receberá nenhuma exception, mensagem de erro ou nada parecido. Então, como sabemos se o backup ou restauração foi feito com sucesso nesse caso? Simples: basta analisarmos a propriedade AsyncStatus da classe Backup ou Restore. Ela retornará se a operação foi executada com sucesso e, no caso de erro, a última exception que foi lançada. É uma maneira bem estranha de se implementar chamada assíncrona, mas, funciona.
E se o backup tiver sido excluído?
Mesmo se você excluir um dos arquivos de backup, ele continuará sendo exibido na lista de backups. Isso porque a lista interna do SQL Server não considera se o arquivo de backup ainda existe em disco ou não. Por razões obvias, se você tentar restaurar um backup cujo arquivo foi excluído, você receberá uma exception:
Cannot open backup device ‘C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\Backup\test.bak’. Operating system error 2(The system cannot find the file specified.). RESTORE DATABASE is terminating abnormally.
Se o banco de dados está rodando no mesmo computador, basta verificarmos se o arquivo existe antes de tentarmos restaurá-lo. Porém, se o banco de dados é remoto, a única maneira de saber se o arquivo ainda existe é “perguntando” para o SQL Server. Você encontra uma das maneiras de realizar essa tarefa neste link: Script to check that backup files still exist for SQL Server.
Backup e restauração sem utilizar o SMO
Após ter publicado este artigo, um dos inscritos da minha newsletter, o Fernando Mesquita, me enviou um exemplo da aplicação dele onde ele faz o backup e restauração de um banco de dados SQL Server no VB.NET sem utilizar o SMO (somente com os comandos BACKUP DATABASE e RESTORE DATABASE do próprio SQL Server). Se você quiser conferir este código, ele disponibilizou para que fosse publicado aqui, e você pode baixá-lo através deste link. Muito obrigado Fernando!
Concluindo
Neste artigo você aprendeu a realizar um backup de banco de dados SQL Server, listar os backups previamente realizados para um determinado banco de dados e efetuar a restauração de um desses backups, tudo utilizando a biblioteca SMO (SQL Server Management Objects), disponível no .NET Framework. Se a sua aplicação utiliza o SQL Server como banco de dados e você estava pensando em adicionar a possibilidade de fazer backup e restauração direto no aplicativo, agora você não tem mais desculpas. Utilize agora mesmo o código apresentado nesse artigo e nos conte nos comentários como foi a sua experiência.
Aproveito para sugerir que você se inscreva na minha newsletter. Ao inscrever-se você receberá uma vez por semana um e-mail sobre o artigo publicado, ficará sabendo em primeira mão sobre o tema dos próximos artigos e ainda por cima receberá uma dica “bônus” por semana, que eu só compartilho por e-mail. Inscreva-se utilizando este link ou através do formulário abaixo.
Até a próxima!
André Lima
Icon by Heart Internet used under Creative Commons
https://www.iconfinder.com/icons/63467/database_storage_icon
Photo by tec_estromberg used under Creative Commons
http://www.flickr.com/photos/92334668@N07/11122773785/sizes/o/
O que são grupos de mastermind (mastermind groups)? Utilizando o provider ADO.NET do MySQL no C#
Primeiramente, André Lima, Obrigado pelo Post que com certeza vai ajudar a muita gente….mas olhando e analisando o código o que precisaria adicionar ou modificar nos métodos para que o Backup e o Restore fosse no lugar ou por opção criado arquivos com a extensão .bak, fosse com a extensão compactada ou .zip ou .rar com o .bak interno a ele ou não
Fico no aguardo e desde já agradeço
Olá Luiz, obrigado pelo comentário..
Com essa maneira que eu mostrei nesse artigo, não é possível escolher o caminho em que o backup será gerado nem a sua extensão.. Os backups serão sempre gerados na pasta padrão de backups do SQL Server e a extensão tem que ser .bak..
Para fazer o que você está querendo, não seria possível utilizando o SMO.. Você teria que fazer o backup na mão (utilizando uma sentença SQL), pegar o arquivo bak gerado e zipar com alguma biblioteca (por exemplo, a ZipStorer).. Para fazer o restore, você teria que dezipar o arquivo e, através de uma sentença SQL, restaurar o banco apontando para o arquivo bak..
As sentenças para fazer o backup e restore você encontra na documentação do MSDN:
https://technet.microsoft.com/en-us/library/ms191304(v=sql.105).aspx
https://msdn.microsoft.com/en-us/library/ms186858(v=SQL.120).aspx
Abraço!
André Lima
Olá,
Trabalhando com bancos de dados na extensão mdf
Eu consegui fazer dessa forma:
public string Efetua_BKP(string spasta)
{
//Achei na internet
//Blog Andre Alves Lima :: http://www.andrealveslima.com.br
var server = new Microsoft.SqlServer.Management.Smo.Server(sServidor);
var backup = new Microsoft.SqlServer.Management.Smo.Backup();
backup.Database = sNome_BD; //Carregar aqui com nome do banco de dados
backup.Incremental = false;
string nomeArquivoBackup = spasta + string.Format(“{0}_{1:dddd}.bak”, sNome_BD, DateTime.Now);
//Fornato final:: ..\Suas Pastas\SeuBanco_quinta-feira.bak
string nomeArquivoZip = spasta + string.Format(“{0}_{1:dddd}.zip”, sNome_BD, DateTime.Now);
//Fornato final:: ..\Suas Pastas\SeuBanco_quinta-feira.zip
try
{
backup.Devices.AddDevice(nomeArquivoBackup, Microsoft.SqlServer.Management.Smo.DeviceType.File);
backup.SqlBackup(server);
Ionic.Zip.ZipFile zFile = new ZipFile();
zFile.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
zFile.Password = “123456”; //Caso desejar senha para o arquivo zip
zFile.FlattenFoldersOnExtract = true;
zFile.Comment = “ZIP Comentário”;
zFile.AddFile(nomeArquivoBackup);
zFile.Save(nomeArquivoZip);
System.IO.File.Delete(nomeArquivoBackup);
return “0”;
}
catch (Exception ex)
{
throw new Exception(“Efetuando Backup–>” + ex.Message);
}
}
Será que vou ter problemas com o RESTORE?
Olá Nelson!
Pelo que entendi, a única coisa que você está fazendo a mais é zipar o arquivo .bak, certo? Se for só isso, acredito que você não terá problemas.. A única coisa é que, obviamente, você terá que extrair o arquivo .bak de dentro do zip antes de fazer o restore..
Abraço!
André Lima
Eu usei o zip unicamente pra economizar espaço…rsrsrs.
Parece que a opção de compressão não funciona no Express Edition.
Quanto a minha perbunta me desculpe, ela não foi bem formulada.
No caso de um “crash” geral no servidor, formatação, reinstalação,etc.
O SqlServer não terá esse bkp em sua lista de backups.
O código restaurará sem problemas?
Olá Nelson!
Agora entendi a sua pergunta.. Teoricamente, se você copiar o arquivo na pasta de backup e passar o caminho completo no primeiro parâmetro do método “AddDevice”, a restauração deve acontecer sem problema.. Para ter certeza, eu faria um teste rápido criando o arquivo de backup em outro computador, copiando para a pasta de backup e tentando fazer a restauração..
Abraço!
André Lima
Fiz o teste e realmente funciona se copiarmos o arquivo .bak para a pasta backup.
Sem efetuar essa cópia retorna o erro:
{“Não é possível abrir o dispositivo de backup ‘C:\\Program Files\\Microsoft SQL Server\\MSSQL11.SQLEXPRESS\\MSSQL\\Backup\\BASE_01_sexta-feira.bak’.
Que no meu caso, é a pasta de bakcup da minha instalação do sqlserver.
Resumindo, uma vez copiado o arquivo .bak para a pasta backup, tudo transcorre sem erros.
Olá Nelson, obrigado pelo retorno!
Que bom que funcionou copiando o arquivo para o diretório de backup.. Dessa forma está tudo correto com a sua aplicação, não? Ou tem alguma coisa pendente ainda no que diz respeito a backup/restauração?
Abraço!
André Lima
Olá André,
Está tudo uma maravilha!!!
Eu até demorei pra retornar porque o problema tinha parado mas, era pura sorte…rsrsrs.
Eu estava usando um método, a SMO, pra fazer o bkp, e outro pro restore, executava um script com RESTORE/REPLACE. Acontece que de vez em quando dava erro de compatibilidade.
Acredito que agora, usando a mesma ferramenta, tanto pra um quanto pro outro procedimento, a coisa flua sem problemas.
A única coisa que tive de acrescentar foi uma pequena rotina que automatizasse a cópia do .BAK para a pasta correta.
Agradeço muito sua atenção e paciência comigo.
Um abraço, e, continue nos ajudando…rsrsrs
Olá Nelson!
Que beleza! Fico feliz por você ter conseguido fazer funcionar no final das contas.. Isso é o que importa.. ;)
Muito obrigado por ter voltado aqui e contado pra gente os detalhes da sua solução.. Qualquer dúvida sobre outros assuntos, é só entrar em contato..
Abraço!
André Lima
Olá André, eu li seu artigo mais no meu notbook ao fazer a referencia do SMO em meu projeto, essas referencia: –
-Microsoft.SqlServer.Management.Sdk.Sfc
– Microsoft.SqlServer.Smo
– Microsoft.SqlServer.SmoExtended
Não aperecem na aba Extensions do referencia manager
Estou usando o visual studio 2013 expreess.
Você tem uma sugestao do por que disso e como solucionar?
Obrigado
Olá Nascimento!
Você tem o SQL Server instalado no computador de desenvolvimento.. Se você não tiver, essas opções não aparecerão na janela de referências.. E qual versão do .NET você está utilizando na sua aplicação? É desktop ou web?
Enfim, no meu artigo sobre instalação do SQL Server junto com a aplicação (que você pode acessar clicando aqui), eu disponibilizo as dlls do SMO que eu compiei do meu computador (se quiser, baixe o arquivo zip aqui)..
Abraço!
André Lima
Obrigado André pela resposta, tenho o SQL Server express 2012 instalado, Net 4,5 não sei dizer se DESKTOP OU WEB
Mais eu vou examinar direitinho esse outro artigo instalando o sql junto com a aplicação.Se poder me dizer como faço para saber qual NET TENHO instalado em minha maquina.
Olá Nascimento!
Para descobrir as versões do .NET Framework instaladas no seu computador, dê uma olhada neste artigo que lista algumas opções de ferramentas para esse propósito:
5 Ways to Check What Version of Microsoft .NET Framework is Installed on your Computer
Abraço!
André Lima
Boa noite André, copiei as dlls que você disponibilizou. Em que pasta eu coloco para usar em meu projeto?
Obrigado
Olá Nascimento!
No computador de desenvolvimento, você pode copiar em qualquer pasta do projeto.. Normalmente, nesse caso costuma-se criar uma pasta “packages” dentro da estrutura do projeto para colocar essas dlls externas, aí você faz a referência a partir dessa pasta..
Já no computador onde a aplicação será instalada, você precisará distribuir as dlls na mesma pasta onde a aplicação (exe) estiver instalada..
Abraço!
André Lima
Boa noite André, desculpa por te importunar mais uma vez, baixei as dlls que você disponibilizou, obrigado. Criei uma pasta no meu projeto e colei dentro, Mais eu não consigui fazer a referencia apartir dela como você disse. Se voce poder me dar um exemplo na prática, agradeço de mais.
Abração
Olá Nascimento!
Você poderia explicar com mais detalhes? Como assim, você não conseguiu fazer a referência? Você recebeu um erro? As dlls não apareceram?
Abraço!
André Lima
Boa noite André. Eu tenho um projeto em camadas a classe AcessoDados onde faco a conexão e comunicação com o banco de dados, RegraNegocio fazendo referencia com a Classe AcessoDados e Interface com os formularios, fazendo referencia com as duas classes :RegraNegocioe RegraNegocio. Criei a pasta SMO dentro da classe RegraNegocio e colei AS DLLS DENTRO mesmo asssim quando eu faço a referencia do formulario frmBackup, elas não aparecem.
Tentei fazer assim também mais dar erro na linha abaixo
if (o.ShowDialog == Windows.Forms.DialogResult.OK)
somente a palavra Windows fica grifada vermelho
se puder dar uma analisada e me dizer como corrigir este erro agradeço também. Esse projeto tá quase pronto, só prociso fazer o backup distribuir o sql server junto com o aplicativo.
private void btnbackup_Click(object se
nder, EventArgs e)
{
//FazerBackup()
try
{
string fileOrigem = Application.StartupPath + “\\Farmacia”;
string filedestino = null;
FolderBrowserDialog o = new FolderBrowserDialog();
if (o.ShowDialog() == DialogResult.OK)
if (o.ShowDialog == Windows.Forms.DialogResult.OK) <é aqui o erro.
//return;
filedestino = o.SelectedPath + "\\soaiDadosCompact.mdf";
System.IO.File.Copy(fileOrigem, filedestino);
MessageBox.Show("Backup Realizado com Sucesso.");
}
catch (Exception ex)
{
MessageBox.Show("Erro ao fazer cópia de segurança.Tente novamente, se o erro persistir reinicie o sistema.", "Erro " + ex.Message);
}
}
Muito agradecido por enquanto.
Olá Nascimento!
Não sei se você colou o código errado, mas aparentemente tem dois “ifs” checando o retorno de ShowDialog.. O primeiro está correto, o segundo você pode deletar, porque não faz sentido (primeiro porque não precisa fazer duas vezes, segundo porque você colocou ShowDialog sem os parênteses, e como ele é um método, não vai funcionar mesmo)..
É exatamente esse mesmo o seu código ou deu algum problema na hora de copiar e colar?
Abraço!
André Lima
André muito obrigado por mais uma resposta e principalmente por indicar o erro em meu código que fazia com que não desse certo o backup, corrigi e deu certo. Por lá eu só não ainda restaurar o backup, mais vou pesquisar até conseguir fazer a restauração por meio do aplicativo.
assim que tiver um tempo vou me aprofundar no seu artigo sobre disponibilizar o SQL SERVER EXPRESS junto com a aplicação. achei interessante.
Legal, Nascimento.. Que bom que deu certo a correção.. Qualquer dúvida que você tiver nos outros processos, é só entrar em contato e mandar mais informações..
Abraço!
André Lima
Muito obrigadão senhor Alves, por todo esforço evidenciado em atendimento das questões dos seus seguidores,gostei muito do post.Vou estudar o código e tirar o melhor proveito possível… valeu…
Olá Minervo, obrigado pelo comentário!
Fico feliz que tenha gostado do artigo.. Qualquer coisa é só entrar em contato!
Abraço!
André Lima
olá André, desculpa pela ignorância estou iniciando agora em c# seria possível a criação de banco de dados utilizando o SMO?
agradeço pela atenção…
Olá Wesley, obrigado pelo comentário!
Dá pra criar databases com o SMO sim.. Na documentação do SMO tem um exemplo, veja só:
Creating, Altering, and Removing Databases
Abraço!
André Lima
Obrigado André pela atenção.
Abraços…
Magina Wesley! Eu que agradeço a leitura e o seu comentário!
Abraço!
André Lima
SMO n faz backup quando os arquivos estão em diretório na rede n ?
Olá Leo, primeiramente, obrigado pelo comentário!
É para funcionar o backup em diretório na rede sim, desde que, obviamente, o usuário tenha permissão de leitura e gravação no caminho da rede.. Você tentou e não conseguiu? Qual é exatamente o problema que você está enfrentando?
Abraço!
André Lima
Olá André,
Teria como eu definir o diretório do backup, exemplo: “c:\\backup” ?
Olá Wellington!
Você pode definir o caminho que quiser para o backup.. Por exemplo, para armazenar o backup na pasta “C:\\backup” como você está querendo, basta alterar a seguinte linha:
Porém, você precisa estar atento que o arquivo será gerado no computador onde o SQL Server está rodando (e nao no computador local).. A única maneira de gerar o backup em um disco local é se você tiver um compartilhamento de disco e o computador onde o SQL Server estiver rodando consiga acessar esse compartilhamento..
Além disso, fique atentou pois o usuário que está sendo utilizado para rodar o servico do SQL Server deve ter permissoes de leitura e gravacao nessa pasta que você tiver escolhido..
Abraco!
André Lima
Estou precisando de ajuda, não estou conseguindo adicionar essas referencias em meu projeto. Estou usando o SQL SERVER 2012 X64 e o C# 2015
Olá novamente Sames!
Como não está conseguindo? Não está encontrando os itens ou está dando algum erro? Você está procurando as referências na aba “Extensions” ou está procurando as dlls diretamente na pasta de instalação do SQL Server? Se não estiver encontrando na aba “Extensions”, procure diretamente na pasta de instalação do SQL Server:
C:\Program Files (x86)\Microsoft SQL Server\120\SDK\Assemblies\
A pasta exatamente depende da sua versão do SQL Server.. Deve estar em algum lugar parecido com este que eu indiquei acima (ou em Program Files sem o “x86”)..
Abraço!
André Lima
Andre, me ajude por gentileza.
Consegui fazer o backup mas não consegui restaurar…ele acha o caminho do backup que fiz no combobox mas da erro na hora de carregar : restore.SqlRestore(server);
E como seria para banco de dados local?
aguardo
An unhandled exception of type ‘Microsoft.SqlServer.Management.Smo.FailedOperationException’ occurred in Microsoft.SqlServer.SmoExtended.dll
este é o erro!
Olá Rennan, obrigado pelo comentário!
Essa mensagem de erro é muito genérica (FailedOperationException).. Você não consegue captar mais detalhes da exception (tipo a InnerException) para tentarmos entender o que está acontecendo exatamente?
Se o erro que você estiver obtendo for relacionado ao banco de dados estar em uso, tente configurar a propriedade ReplaceDatabase como “true” antes de chamar o método SqlRestore.. Dê também uma olhada neste link e veja se te ajuda em algo:
SMO : Restore failed for Server ‘.’
Caso nenhuma dessas opções te ajude, me mande um e-mail com mais detalhes da exception..
Ah, e quanto a backup remoto / local, não tem diferença.. O exemplo que eu mostro neste artigo foi para um banco de dados local que eu tenho rodando no meu computador (por isso o endereço do servidor é “.\SQLEXPRESS”, onde “.” quer dizer “local” ou “localhost”)..
Abraço!
André Lima
Onde eu acho a propriedade replaceDataBase Andre?
Estou achando que é esse meu problema !
abraço
Consegui Andre! Pesquisei e consegui , muito obrigado ! Abraço
Olá André!
Bom rodando a minha aplicação em rede ocorre o seguinte erro:
System.IO.FileNotFoundException: Não foi possível carregar arquivo ou assembly ‘Microsoft.SqlServer.Smo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91’ ou uma de suas dependências. O sistema não pode encontrar o arquivo especificado.
Nome do arquivo: ‘Microsoft.SqlServer.Smo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91’
em DXApplication3.CriaBaseDeDados..ctor()
em DXApplication3.FrmAlfa.button1_Click(Object sender, EventArgs e)
em System.Windows.Forms.Control.OnClick(EventArgs e)
em System.Windows.Forms.Button.OnClick(EventArgs e)
em System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
em System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
em System.Windows.Forms.Control.WndProc(Message& m)
em System.Windows.Forms.ButtonBase.WndProc(Message& m)
em System.Windows.Forms.Button.WndProc(Message& m)
em System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
em System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
em System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
AVI: o log de ligações de assembly está desativado.
Para ativar o log de falhas de assembly, defina o valor do Registro [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) como 1.
Observação: há alguma penalidade para o desempenho associada ao log de falha de ligação de assembly.
Para desativar esse recurso, remova o valor do Registro [HKLM\Software\Microsoft\Fusion!EnableLog].
bom eu acho q é por causa que esta faltando a dll certo?
Agraceço pela atenção
Olá Wesley, obrigado pelo comentário!
Sim, esse erro quer dizer que as dlls do SMO estão faltando.. Você encontra a maioria das dlls do SMO dentro da pasta “C:\Program Files (x86)\Microsoft SQL Server\120\SDK\Assemblies\” no computador onde você desenvolveu o aplicativo. Somente uma delas (Microsoft.SqlServer.SqlClrProvider.dll) fica dentro do GAC. Para facilitar a sua vida, eu compactei as dlls do SMO e estou disponibilizando para que você faça o download através deste link.
Copie as dlls do SMO no mesmo diretório onde a sua aplicação está instalada na rede e tudo deve funcionar normalmente..
Abraço!
André Lima
OK funcionou :)
Agradeço pela ajuda André…
Legal Wesley! Fico feliz que tenha funcionado..
Abraço!
André Lima
André , eu consegui fazer com o sql instalado que no caso minha conexão com o sql é rennanrennan mas não consegui no bdlocal.
como seria ? sendo que meu bdlocal esta no c:nome da pastabanco de dados ?
Olá Rennan!
Que bom que você conseguiu resolver o problema que você estava tendo anteriormente.. Quanto à sua dúvida sobre bd local, o que exatamente você quer dizer com banco local? É simplesmente um mdf que você atacha na instância do SQLEXPRESS? Por favor, dê maiores detalhes do que você está querendo dizer com isso.. Se possível, com screenshots.. Caso prefira, entre em contato comigo por e-mail (meu endereço está disponível na minha página “Sobre“)..
Abraço!
André Lima
SIM , é um .mdf não acho o caminho! Da erro ao compilar por não achar o caminho
É um projeto que nele foi criado um .mdf e um .log que ficam no c: para funcionar…assim sendo, não sei o caminho que devo colocar no textbox servidor . Sou iniciante em c# desculpe , são as informações que consigo lhe fornecer, espero que me ajude.
Olá Rennan!
Nesse caso, como você está atachando o MDF, o backup seria uma cópia do próprio MDF.. Você não precisa fazer o backup pela engine do SQL Server, mas sim, somente uma cópia do MDF..
Dessa forma, antes de fazer a conexão com o banco de dados (ou depois de ter finalizado a conexão), faça uma cópia do arquivo MDF e pronto.. Você terá um backup do banco..
Abraço!
André Lima
Eu queria que o proprio cliente pudesse fazer o backup dele introduzindo seu projeto ao meu . E nao sei o que digitar no database nem no servidor.
Tenho um projeto no qual inseri seu projeto de backup nele.
Preciso que ao cliente entrar no menu backup dentro do meu projeto , ele possa digitar o servidor e o database e fazer um backup do banco de dados .mdf e .log instalados no computador dele. E depois possa restaurar futuramente caso houver algum problema com a maquina é isso !Pode me ajudar, pois nao encontro o caminho que tnho que digitar nos textbox ”database” e ”servidor”. Obrigado Andre
Olá novamente Rennan!
Esquece este exemplo para bancos de dados atachados.. Se você está atachando o MDF, você não precisa fazer o backup dessa forma.. Basta criar uma sub-pasta no diretório do seu aplicativo (chamada “Backups”, por exemplo) e copiar o MDF para lá.. Pronto, aí você tem um backup do banco..
Para restaurar, basta ler os arquivos disponíveis nessa pasta e substituir o MDF original pelo arquivo gerado durante o backup..
Todas essas operações de cópia e movimentação de arquivos você encontra na classe “File”, do namespace System.IO.. Para maiores informações, consulte a documentação no MSDN:
How to: Copy, Delete, and Move Files and Folders (C# Programming Guide)
Abraço!
André Lima
Não da para simplesmente fazer como ensinou mas com a diferença do BDLocal .mdf?
Queria tipo assim : tenho um menu onde tenho a aba Backup, sendo sub menus backup e restore. Para o próprio cliente fazer . Teria como ? É muito complicado ? Porque como pode ver, sou novato em c#. Obrigado
Olá Rennan!
Que eu saiba, não dá para fazer o backup dessa forma que eu mostrei no artigo com bancos locais atachados.. E, novamente, não faz o menor sentido fazer o backup dessa forma que eu ensinei se você está atachando o MDF..
O que você precisa fazer é o que expliquei no meu comentário anterior.. No seu menu de backup, você cria uma cópia do MDF em uma sub-pasta “Backup” e no menu de restore, você substitui o arquivo que está na pasta “Backup” em cima do MDF original que é utilizado pelo aplicativo..
Como falei, todas as funcionalidades de cópia e movimentação de arquivos estão disponíveis na classe File do namespace System.IO..
Por exemplo, para copiar o MDF para uma pasta chamada “Backup” seria algo como:
Para listar os arquivos disponíveis na pasta “Backups”:
E a substituição do arquivo de backup em cima do original também é uma cópia, só que com os caminhos invertidos (o arquivo de backup como fonte e o caminho onde o MDF fica como destino)..
Conseguiu entender mais ou menos?
Abraço!
André Lima
Sim sim , agora sim ! Muitoooo obrigado pela atenção Andre.
Abraço Forte.
Legal, Rennan! Qualquer coisa entre em contato novamente..
Abraço!
André Lima
Muito Bacana André, já estou rodando.. kkk obrigado, ajudou muito!
Valeu Eduardo! Obrigado pelo comentário! Fico feliz que o artigo tenha te ajudado..
Abraço!
André Lima
Que isso André, eu que agradeço
Abraços…
Professor, como faço para colocar no select uma ordenação por decrescente dos banco disponiveis para restauração? Obrigado
Olá André!
É só colocar um ORDER BY na query:
Abraço!
André Lima
Olá André, parabéns pelo post. Excelente!
Esse roteiro também é válido para bancos publicados em provedores por exemplo? Ou só para máquinas locais?
Obrigado.
Olá Paulo!
Essa rotina também funciona em servidores remotos.. O único detalhe é que o backup será salvo na pasta “Backups” do próprio servidor onde o SQL Server está rodando (e não do computador cliente)..
Abraço!
André Lima
Andre , boa tarde. Como eu poderia colocar na minha string de conexao para puxar o banco de dados de um servidor online sql server e fazer o backup na minha maquina?
Olá Jorge!
Não tem como.. O comando de backup só possibilita a criação do arquivo no computador remoto.. Essa é simplesmente uma limitação do SQL Server e não dá para contorná-la nem utilizando o SQL Server Management Studio.. Backups só em discos atachados no próprio servidor..
Dessa forma, você teria que partir para algumas alternativas, como, por exemplo, fazer o backup no computador remoto em uma pasta que fosse acessível via FTP .. Aí você dispara o backup pelo computador cliente, espera ele ficar pronto, conecta via FTP na pasta onde o backup foi gerado e copia para o computador cliente..
Um tanto quanto complicado, mas, somente seria possível com algo do tipo..
Abraço!
André Lima
ola… cara se eu for fazer um backup de um servidor remoto… é só colocar o ip do servidor no lugar do localhost?? estou tentando mas sem sucesso … pode me ajudar?? vlw ae
Olá Douglas!
Não dá para fazer backup de um servidor SQL Server remoto.. Os backups do SQL Server só podem ser gerados em discos que estão atachados no próprio servidor.. Acabei de dar uma resposta mais detalhada para essa mesma pergunta feita pelo Jorge logo acima.. Clique aqui para ver a resposta que eu dei para ele..
Abraço!
André Lima
Fala André, beleza?
Como deve ser o código para acessar a base para fazer o backup? Fazer backup requer autenticação?
Olá Leopoldo!
Não entendi a sua primeira pergunta.. O código para acessar a base para fazer o backup é justamente o que está sendo mostrado no artigo, mais especificamente, na seção “Efetuando um backup”..
Por padrão, somente usuários com as roles sysadmin, db_owner ou db_backupoperator conseguem efetuar backups no SQL Server..
Se você tiver que passar uma credencial específica na hora de criar o objeto “Server” do SMO, você terá que utilizar a classe ServerConnection, conforme demonstrado neste artigo do CodeProject:
SQL Server Authentication using SMO
Abraço!
André Lima
É, não me expressei bem, perdão.
A minha dúvida foi justamente essa: Como fazer para o usuário que for fazer o backup poder inserir um logon no SQL Server para acessar a base e fazer o backup. Tipo 2 textboxes para usuário e senha do banco para poder acessar.
Olá Leopoldo!
Primeiramente, desculpe a demora com a resposta.. Meu segundo filho nasceu no final de semana retrasado e eu acabei tirando a semana passada off..
Enfim, quanto à sua questão, tente algo parecido com este código:
Depois me avisa se funcionou..
Abraço!
André Lima
Olá André
Eu fiz um backup e restore de acordo com o que você exemplificou, mas quando eu inicio o programa o combobox fica processando e não mostra nada, tem alguma ideia de onde errei?
Olá Éder!
Ele fica processando e trava ou fica processando e depois mostra uma lista vazia? Não tenho ideia do que pode estar acontecendo.. O código está exatamente do mesmo jeito que eu apresentei no artigo?
Abraço!
André Lima
Olá André!
Funcionou perfeitamente, porém se eu quiser mudar o caminho para onde salva o .bak quando clico no botão “Backup” onde devo alterar o código?
Olá Ricardo!
Em teoria, para alterar a pasta onde o backup é feito, você precisa alterar a propriedade BackupDirectory da instância de Server antes de chamar o SqlBackup/SqlRestore.. Após alterar o BackupDirectory, você precisa chamar o método “Alter”:
Eu não testei, mas, como eu disse, em teoria, deve funcionar.. Depois volta aqui e avisa a gente se funcionou..
Abraço!
André Lima
Obrigado!!! Não tinha reparado em um comentário que você já havia respondido, e somente alterei para:
string nomeArquivoBackup = string.Format(“C:\\PASTA\\{0}_{1:yyyyMMdd_HHmmss}.bak”, databaseTextBox.Text, DateTime.Now);
Deu certo!
Obrigado!
Olá Ricardo!
Maravilha! Não lembrava que eu já tinha respondido essa questão nos comentários.. Que bom que deu certo alterando o caminho no próprio nome do arquivo.. Qualquer coisa entre em contato novamente..
Abraço!
André Lima
[…] Se você não sabe o que é SMO, dê uma olhada no meu artigo sobre criação e restauração de backups do SQL Server através do C#, onde eu utilizo o SMO para realizar essa […]
[…] dos artigos mais acessados até hoje aqui no site é aquele onde eu mostrei como podemos fazer backup e restauração do SQL Server através do C#. Esses dias atrás, recebi um e-mail de alguém que tinha lido esse artigo perguntando como ele […]
Olá,
Tenho uma dúvida.
Se formato o PC, posso restaurar um BKP que não esteja na lista de BKPs?
Olá Nelson!
Eu não testei, mas acredito que funcionaria com o SMO, se você passar o caminho do backup no primeiro parâmetro do método AddDevice:
Se não funcionar, você poderia fazer tranquilamente sem o SMO, utilizando somente o comando RESTORE DATABASE.. Eu fiz algo parecido neste artigo (veja o código do método “RestaurarDBPadrao”):
Instalando o SQL Server junto com a aplicação
Abraço!
André Lima
Cara valew mesmo!!
Me ajudou muito, por eu ser iniciante facilitou muito. Agora nao preciso ficar fazendo backup manualmente no SQL Server.
Continue dedicando seu tempo ajudando o proximo e compartilhando conhecimento, nos novatos agradecemos!!
Olá Fabio, obrigado pelo comentário! Fico feliz que o artigo tenha te ajudado no seu projeto.. :)
Pode deixar que vou continuar publicando artigos no próximo ano.. Espero que eles ajudem também..
Um grande abraço!
André Lima
Parabéns pelo conteúdo.
O que me surpreendeu foi que você tem um vasto conhecimento em .net mas o site é feito em PHP rs.
Abraço.
Olá Rafael, muito obrigado pelo comentário!
O blog é em PHP porque eu utilizo o WordPress, que na minha opinião é a melhor ferramenta de blog disponível hoje em dia.. Não faz sentido criar outro site em .NET só pra servir de blog se o WordPress já entrega um resultado excelente.. Além disso, tenho pouca experiência com desenvolvimento web.. :)
Abraço!
André Lima
Sou muito fraco em c#: para copiar o mdf tá Ok mas para inverter a linha sou fraco.
System.IO.File.Copy(“NomeDoSeuMdfOriginal.mdf”, System.IO.Path.Combine(Environment.CurrentDirectory, “Backups”, “MdfBackup_” + DateTime.Now.ToString(“yyyyMMdd_HHmmss”) + “.mdf”), true);
pode me ajudar a restaurar o mdf com o nome anterior?
Olá Kleber!
Não entendi exatamente o que você está querendo fazer.. Poderia explicar com mais detalhes? Se possível manda o seu código atual e explica o que você está tentando alterar..
Abraço!
André Lima
Bom dia,
Agradeço as respostas para minhas dúvidas.
Tenho um sistema que não pretendo rodar em rede. Mono usuário. Tenho a arquivo MDF dentro da pasta onde foi instalado, C:\\Arquivos de programas…
O código que passou para gerar um arquivo backup rodou bacana. Gostaria de saber o código para listar estes arquivos e escolher um para restaurar. Com o mesmo nome do arquivo original. Não pretendo fazer conectar com SQL (mesmo porque não sei colocar o sistema em rede, gostaria).
Olá Kleber!
Pode ser que eu tenha entendido errado a sua explicação, mas se você trabalha na sua aplicação atachando o banco de dados (e não fazendo a restauração no SQL Server), esse artigo de backup e restauração não faz sentido para você.. Nesse caso, como você não está utilizando o SQL Server para gerenciar o banco de dados (você só está atachando ele durante o tempo de execução da sua aplicação), a solução de backup seria simplesmente fazer uma cópia do arquivo MDF em outro lugar..
Para eu ter certeza que não estou falando besteira para você, posta aqui pra gente como é que está a sua string de conexão..
Abraço!
André Lima
Desculpe a demora,
Isso mesmo, não estou usando SQL, somente o banco local. Fiz como passou e posso criar uma cópia do banco:
private void backupButton_Click(object sender, EventArgs e)
{
if (!System.IO.Directory.Exists(“Backups2ESAV”))
{
System.IO.Directory.CreateDirectory(“Backups2ESAV”);
}
System.IO.File.Copy(“NIMBUS_Finalizar.mdf”, System.IO.Path.Combine(Environment.CurrentDirectory, “Backups2ESAV”, “NIMBUS_Finalizar.mdf”), true);
MessageBox.Show(“BackUp da base de dados completada com sucesso!”);
}
Agora, seria possível restaurar essa cópia para substituir o banco em uso?
private void restauracaoButton_Click(object sender, EventArgs e)
{
//MessageBox.Show(“Banco de dados restaurado com sucesso!”);
}
Não consegui fazer o ComboBox listar os arquivos:
private void backupsComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
var Files = System.IO.Directory.EnumerateFiles(“Backups2ESAV”);
}
RECRUTA É FOGO…!
Olá Kleber!
Pelo que pude observar no seu código, você sempre está salvando uma cópia do mdf no diretório “Backups2ESAV”, porém, utilizando todas as vezes o nome “NIMBUS_Finalizar.mdf”.. Se esse for realmente o caso, para restaurar o backup você só precisa sobrescrever o banco original que está no diretório da aplicação pelo arquivo que está no diretório “Backups2ESAV”.. O único “porém” é que você obrigatoriamente teria que fechar todas as conexões ativas com o banco de dados original, senão você não vai conseguir sobrescrever o arquivo porque ele estará em uso..
Quanto à listagem dos arquivos do diretório de backup, ela só fará sentido se você estiver salvando vários backups com nomes diferentes.. Você já está enumerando os arquivos do diretório, a única coisa que está faltando é popular o combobox com o resultado.. Veja se este link te ajuda em algo:
Populating a ComboBox using C#
Se essa resposta não te ajudou, me dê mais detalhes para que eu possa te ajudar melhor..
Abraço!
André Lima
Ainda tentando. Poderia mostrar o erro? Crio o backup da tabela.mdf e arquivo.log, ao restaurar…1 – A tabela é deletada mas não restaurada. 2 – As atribuições do arquivo são alteradas. Preciso manter habilitada a gravar dados.
Segue o código:
private void CriarBackUpToolStripMenuItem1_Click(object sender, EventArgs e)
{
try
{
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
if (File.Exists(saveFileDialog.FileName))
{
File.Delete(saveFileDialog.FileName);
}
File.Copy(Application.StartupPath.ToString() + “\\NIMBUS_Finalizar.mdf”, saveFileDialog.FileName);
MessageBox.Show(“TABELA – Backup criado com sucesso! Iniciar a copia do arquivo de LOG”, “”, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
if (File.Exists(saveFileDialog1.FileName))
{
File.Delete(saveFileDialog1.FileName);
}
File.Copy(Application.StartupPath.ToString() + “\\NIMBUS_Finalizar_log.ldf”, saveFileDialog1.FileName);
MessageBox.Show(“LOG – Backup criado com sucesso!”, “”, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show(“Operação abortada”, “”, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
catch (Exception ex)
{
MessageBox.Show(“Ocorreu um erro” + ex.Message);
}
}
private void RestaurarBackUpToolStripMenuItem1_Click(object sender, EventArgs e)
{
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
File.Exists(Application.StartupPath.ToString() + “\\NIMBUS_Finalizar.mdf”);
{
File.Delete(Application.StartupPath.ToString() + “\\NIMBUS_Finalizar.mdf”);
}
File.Copy(openFileDialog.FileName, Application.StartupPath.ToString() + “\\NIMBUS_Finalizar.mdf”);
MessageBox.Show(“TABELA restaurada com sucesso”, “”, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
File.Exists(Application.StartupPath.ToString() + “\\NIMBUS_Finalizar_log.ldf”);
{
File.Delete(Application.StartupPath.ToString() + “\\NIMBUS_Finalizar_log.ldf”);
}
File.Copy(openFileDialog1.FileName, Application.StartupPath.ToString() + “\\NIMBUS_Finalizar_log.ldf”);
MessageBox.Show(“LOG restauradO com sucesso”, “”, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show(“Operação abortada”, “”, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
Obrigado!
Olá Kleber!
Cara, não consegui entender o que você fez na sua implementação.. Você só precisa copiar os arquivos MDF e LDF em uma pasta de backups (com File.Copy, como você aparentemente já está fazendo).. Depois, na hora de restaurar, você pega os arquivos dessa pasta onde você salvou o backup e copia por cima dos arquivos originais (também com File.Copy).. Não tem muito segredo.. É basicamente a mesma sistemática de fazer backup e restauração de qualquer arquivo (copia para outro lugar e depois restaura caso necessário)..
Nestes links você encontra uma implementação de backup e restore de arquivos MDB, que é basicamente a mesma coisa que você está querendo fazer, porém, no seu caso são arquivos MDF.. Dá uma olhada e veja se te ajuda:
How to backup and restore access database using C#.Net – Part 1
How to backup and restore access database using C#.Net – Part 2
Abraço!
André Lima
Olá Andre Bom dia
Um tópico muito interessante.
Estou com um problema quando declaro a variável “var server = new Microsoft.SqlServer.Management.Smo.Server(@”.\SQLEXPRESS”);”
Quando eu inicio o programa e clico para o programa efetuar o backup ele me retorna a seguinte mensagem:
“Não foi possível carregar arquivo o assembly ‘Microsoft.SqlServer.SqlClrProvider, Version = 14.100.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91’ ou uma de suas pendências. O sistema nao pode encontrar o arquivo especisifcado”
O que será este erro?
Obs: Já fiz alguns testes e o problema é nesta linha do código apenas.
Desde já obrigado
Olá Adriano, muito obrigado pelo comentário!
Que estranho hein.. Esse erro está acontecendo no computador de desenvolvimento ou no cliente? Qual é a versão do SQL Server instalada no computador onde a aplicação está rodando? Essa dll SqlClrProvider normalmente é instalada dentro do GAC automaticamente.. Se o erro estiver acontecendo no computador do cliente, uma alternativa seria copiar essa dll do GAC no computador de desenvolvimento e colocar dentro da pasta da aplicação no computador do cliente..
Abraço!
André Lima
Buenas tardes Andé. muchas gracias por el post, le implementé en un servidor SQL Express y funcionó muy bien.
Me ayudaste mucho.
Gracias por compartir!!!.
Olá Jorge, muito obrigado pelo comentário! Fico feliz que tenha funcionado tudo certinho no seu ambiente..
Um forte abraço!
André Lima
Olá pessoal, estou com problemas ao efetuar o backup.
Mensagem: Backup failed for server ”.
Alguém poderia ajudar
Olá!
Que estranho hein.. Você está utilizando exatamente o mesmo código que foi apresentado no artigo? Ou você alterou alguma coisa? Você tem certeza que está digitando o nome correto do banco de dados no TextBox?
Abraço!
André Lima
Bom dia André. Finalmente consegui fazer o backup na forma que vc mostra aqui nesse post. Mas dar erro na hora de restaurar Restore field e mostra no nome da conexão local. Após fazer o backup, restaurei o banco de dados diretamente no managment Studio, funcionou a primeira vez, fiz novamente outro backup, mais na segunda vez que fui restaurar não funcionou mais. Tem alguma causa específica o por que disso?
Obrigado
Olá Nascimento!
Você poderia detalhar os erros que você está recebendo? Dessa forma talvez eu possa entender melhor o que está acontecendo..
Abraço!
André Lima
andrealveslima gostei do seu artigo você conseguiu trazer de forma simples um bachup sou programador iniciante to fazendo curso de c# e vou abordar esse seu artigo em sala para compartilhar com os alunos que estuda comigo,
só queria saber uma coisa no codigo onde cria o bachup teria como mudar o Diretório onde salva o backup tipo criar uma pasta em um local difrente?
Olá Thiago, muito obrigado pelo comentário!
Você pode alterar o caminho do backup colocando um caminho completo na variável “nomeArquivoBackup”.. No exemplo do artigo eu coloco somente o nome do arquivo, dessa forma o backup será criado na pasta “Backup” do diretório do SQL Server.. Se você colocar o caminho completo, ele será salvo no caminho indicado..
Porém, um detalhe: o caminho considerado é sempre no servidor, e não no computador local (que está realizando o backup).. Não dá para fazer backup remoto com o SQL Server (de forma que o arquivo de backup seja salvo no computador remoto e não no servidor).. O arquivo de backup sempre é salvo no servidor..
Abraço!
André Lima
Parabéns!!! Explicação show de bola!!! Muito obrigado
Valeu, Neto! Muito obrigado pelo comentário!
Abraço!
André Lima