none
Alterar destino do backup dentro de um 'CATCH' RRS feed

  • Pergunta

  • Boa noite amigos,

    Dentro de uma função, tenho um tratamento de erro (try/catch). É um sistema que realiza backup de banco de dados. Dentro do 'Catch' estou tentando colocar um FolderBrowserDialog para alterar o destino do backup.

            public void LocalizarDestino()
            {
                
                FolderBrowserDialog dlg = new FolderBrowserDialog();
                if (dlg.ShowDialog() == DialogResult.Yes)
                {
                    txtDestino.BeginInvoke((MethodInvoker)delegate
                    { txtDestino.Text = dlg.SelectedPath; });
                }
                
            }

    Porém a seguinte mensagem de erro é apresentada e não consigo alterar o destino.

    ---------------------------
    
    ---------------------------
    O thread atual deve ser definido no modo STA (single thread apartment) 
    antes que chamadas OLE possam ser feitas. Verifique se a função Main tem 
    STAThreadAttribute marcado. A exceção somente será gerada se um depurador 
    estiver anexado ao processo.
    ---------------------------
    OK   
    ---------------------------

    Lembrando que executo essa tarefa em um BackgroundWorker.

    O código fica basicamente assim:

    try
                                {
                                    cmdBkp.Connection = conn;
                                    cmdBkp.CommandType = CommandType.Text;
                                    cmdBkp.CommandTimeout = 300;
                                    reader.Close();
                                    cmdBkp.ExecuteNonQuery();
                                }
                                catch (Exception ex)
                                {
    
                                    txtLogs.BeginInvoke((MethodInvoker)delegate
                                    { txtLogs.Text = ex.Message; });
    
                                    pbCarregando.BeginInvoke((MethodInvoker)delegate
                                    { pbCarregando.Visible = false; });
    
                                    btDesconectar.BeginInvoke((MethodInvoker)delegate
                                    { btDesconectar.Enabled = true; });
    
                                    btFazerBackup.BeginInvoke((MethodInvoker)delegate
                                    { btFazerBackup.Enabled = true; });
    
                                    sStripBackup.BeginInvoke((MethodInvoker)delegate
                                    { tsStripStatusBackup.ForeColor = Color.DarkRed; tsStripStatusBackup.Text = "[ERRO] Não foi possível realizar o backup..."; });
    
                                    MessageBox.Show("Ops! Ocorreu um erro ao tentar realizar o backup de todos os bancos de dados. " +
                                    "Verifique se possui espaço em disco. Caso o problema persista, entre em contato com o suporte técnico.",
                                    "Aviso do Sistema",MessageBoxButtons.OK,MessageBoxIcon.Stop);
    
                                    LocalizarDestino(); // AQUI EU CHAMO A FUNÇÃO PARA ALTERAR O DESTINO DO BACKUP.
    
                                    bgWorkerBackup.CancelAsync();
    
                                    conn.Close();
                                    cmdBkp.Dispose();
                                    return;
                                }

    Alguma luz? 

    Obrigado!

    sexta-feira, 30 de setembro de 2016 02:10

Respostas

  • "Estudante_CSharp", o que esse erro quer dizer é que o PROGRAMA (não o método que você descreveu, mas o sim o método "MAIN" que inicia o programa) não foi iniciado como SINGLE THREAD APPARTMENT, ou seja, você precisa colocar o atributo "STAThread" no método "Main(string[])" do programa.
    sábado, 1 de outubro de 2016 21:48

Todas as Respostas

  • Boa tarde Estudante_CSharp,

    Tente adicionar o STAThreadAttribute no method Main. Esse atributo é necessário se o seu programa acessa funções relacionadas com OLE.

    [STAThread]
    static void Main(string[] args)
    {
    }

    Atenciosamente,

    Robson William Silva

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.


    sexta-feira, 30 de setembro de 2016 18:12
    Moderador
  • Robson, não entendi como realizar o procedimento amigo, pode me mostrar via código?
    sábado, 1 de outubro de 2016 17:33
  • Você não pode colocar esse código do catch no evento RunWorkerCompleted?

    BackgroundWorker worker = new BackgroundWorker();
    
    worker.DoWork += delegate (object s, DoWorkEventArgs args)
    {
    	//Codigo aqui
    };
    
    worker.RunWorkerCompleted += delegate (object s, RunWorkerCompletedEventArgs args)
    {
    	//Mudança na UI aqui
    };
    
    worker.RunWorkerAsync();

    sábado, 1 de outubro de 2016 19:44
  • "Estudante_CSharp", o que esse erro quer dizer é que o PROGRAMA (não o método que você descreveu, mas o sim o método "MAIN" que inicia o programa) não foi iniciado como SINGLE THREAD APPARTMENT, ou seja, você precisa colocar o atributo "STAThread" no método "Main(string[])" do programa.
    sábado, 1 de outubro de 2016 21:48