André Alves de Lima

Talking about Software Development and more…

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/

Newsletter do André Lima

* indicates required



Powered by MailChimp

105 thoughts on “Backup e restauração de bancos de dados SQL Server pelo C#

  • Luiz Antonio Duarte Estevam Franco disse:

    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

    • andrealveslima disse:

      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

      • Nelson disse:

        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?

        • andrealveslima disse:

          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

          • Nelson disse:

            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?

          • andrealveslima disse:

            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

          • Nelson A. Sousa disse:

            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.

          • andrealveslima disse:

            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

          • Nelson A. Sousa disse:

            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

          • andrealveslima disse:

            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

      • Nascimento disse:

        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

        • andrealveslima disse:

          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

          • Nascimento disse:

            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.

          • andrealveslima disse:

            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

          • Nascimento disse:

            Boa noite André, copiei as dlls que você disponibilizou. Em que pasta eu coloco para usar em meu projeto?

            Obrigado

          • andrealveslima disse:

            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

          • Nascimento disse:

            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

          • andrealveslima disse:

            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

          • Nascimento disse:

            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.

          • andrealveslima disse:

            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

          • Nascimento disse:

            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.

          • andrealveslima disse:

            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

  • Minervo Bendito Afonso disse:

    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…

    • andrealveslima disse:

      Olá Minervo, obrigado pelo comentário!

      Fico feliz que tenha gostado do artigo.. Qualquer coisa é só entrar em contato!

      Abraço!
      André Lima

  • Wesley disse:

    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…

  • Leo disse:

    SMO n faz backup quando os arquivos estão em diretório na rede n ?

    • andrealveslima disse:

      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

  • Wellington disse:

    Olá André,
    Teria como eu definir o diretório do backup, exemplo: “c:\\backup” ?

    • andrealveslima disse:

      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:

      string nomeArquivoBackup = string.Format("C:\\backup\\{0}_{1:yyyyMMdd_HHmmss}.bak", databaseTextBox.Text, DateTime.Now);
      

      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

  • Sames disse:

    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

    • andrealveslima disse:

      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

  • rennan disse:

    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

  • rennan disse:

    An unhandled exception of type ‘Microsoft.SqlServer.Management.Smo.FailedOperationException’ occurred in Microsoft.SqlServer.SmoExtended.dll

    este é o erro!

    • andrealveslima disse:

      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

  • Wesley disse:

    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

    • andrealveslima disse:

      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

  • rennan disse:

    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 ?

    • andrealveslima disse:

      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

      • rennan disse:

        SIM , é um .mdf não acho o caminho! Da erro ao compilar por não achar o caminho

        • rennan disse:

          É 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.

          • andrealveslima disse:

            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

  • rennan disse:

    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.

    • rennan disse:

      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

      • andrealveslima disse:

        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

        • rennan disse:

          Não da para simplesmente fazer como ensinou mas com a diferença do BDLocal .mdf?

          • rennan disse:

            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

          • andrealveslima disse:

            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:

            if (!System.IO.Directory.Exists("Backups"))
            {
            	System.IO.Directory.CreateDirectory("Backups");
            }
            
            System.IO.File.Copy("NomeDoSeuMdfOriginal.mdf", System.IO.Path.Combine(Environment.CurrentDirectory, "Backups", "MdfBackup_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".mdf"), true);        
            

            Para listar os arquivos disponíveis na pasta “Backups”:

            var files = System.IO.Directory.EnumerateFiles("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

  • rennan disse:

    Sim sim , agora sim ! Muitoooo obrigado pela atenção Andre.
    Abraço Forte.

  • Eduardo Oliveira disse:

    Muito Bacana André, já estou rodando.. kkk obrigado, ajudou muito!

  • Eduardo Oliveira disse:

    Que isso André, eu que agradeço
    Abraços…

  • andre spilari disse:

    Professor, como faço para colocar no select uma ordenação por decrescente dos banco disponiveis para restauração? Obrigado

    • andrealveslima disse:

      Olá André!

      É só colocar um ORDER BY na query:

              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) " +
                  "ORDER BY msdb.dbo.backupset.backup_finish_date DESC", connection))
      

      Abraço!
      André Lima

  • Paulo Almeida disse:

    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.

    • andrealveslima disse:

      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

  • Jorge disse:

    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?

    • andrealveslima disse:

      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

  • Douglas disse:

    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

    • andrealveslima disse:

      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

  • Leopoldo disse:

    Fala André, beleza?
    Como deve ser o código para acessar a base para fazer o backup? Fazer backup requer autenticação?

    • andrealveslima disse:

      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

      • Leopoldo disse:

        É, 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.

        • andrealveslima disse:

          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:

              var usuario = txtUsuario.Text;
              var senha = txtSenha.Text;
              var database = databaseTextBox.Text;
              var serverConnection = new Microsoft.SqlServer.Management.Common.ServerConnection(servidorTextBox.Text);
              serverConnection.LoginSecure = false;
              serverConnection.Login = usuario;
              serverConnection.Password = senha;
              serverConnection.DatabaseName = database;
              var server = new Microsoft.SqlServer.Management.Smo.Server(serverConnection);
              // E aqui segue o resto do código para gerar o backup...
          

          Depois me avisa se funcionou..

          Abraço!
          André Lima

  • Éder de Oliveira disse:

    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?

    • andrealveslima disse:

      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

  • Ricardo disse:

    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?

    • andrealveslima disse:

      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”:

      server.BackupDirectory = "OUTRODIRETÓRIO";
      server.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

      • Ricardo disse:

        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!

        • andrealveslima disse:

          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 […]

  • Nelson disse:

    Olá,
    Tenho uma dúvida.
    Se formato o PC, posso restaurar um BKP que não esteja na lista de BKPs?

    • andrealveslima disse:

      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:

      backup.Devices.AddDevice("CAMINHO_DO_ARQUIVO.BAK", Microsoft.SqlServer.Management.Smo.DeviceType.File);
      

      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

  • Fabio Cardozo disse:

    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!!

    • andrealveslima disse:

      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

  • Rafael disse:

    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.

    • andrealveslima disse:

      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?

    • andrealveslima disse:

      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

      • Kleber Alves dos Santos disse:

        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).

        • andrealveslima disse:

          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

          • Kleber Alves dos Santos disse:

            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…!

          • andrealveslima disse:

            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

          • KLEBER SANTOS disse:

            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!

          • andrealveslima disse:

            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

  • Adriano Eduardo Trentin Júnior disse:

    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

    • andrealveslima disse:

      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

  • Jorge Perez disse:

    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!!!.

    • andrealveslima disse:

      Olá Jorge, muito obrigado pelo comentário! Fico feliz que tenha funcionado tudo certinho no seu ambiente..

      Um forte abraço!
      André Lima

  • RAYKAVIN disse:

    Olá pessoal, estou com problemas ao efetuar o backup.
    Mensagem: Backup failed for server ”.
    Alguém poderia ajudar

    • andrealveslima disse:

      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

  • Nascimento disse:

    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

    • andrealveslima disse:

      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

  • thiago disse:

    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?

    • andrealveslima disse:

      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

  • Neto Santos disse:

    Parabéns!!! Explicação show de bola!!! Muito obrigado

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *