none
BackgroundWorker para realizar backup de arquivo RRS feed

  • Pergunta

  • Galerinha,

    Estou com um probleminha aqui:

     

    Eu tenho um form bem bobo que é exibido apenas o progressBar, uma label e um button.

    Este form realiza o backup do SQL para um destino definido pelo usuário.

    O problema que verifiquei a seguinte situação:

    Quando eu clico em gerar backup, eu acompanho na pasta de destino e o arquivo é criado, porém a barra de progresso so inicia depois que é lido todo o backup...

    O mesmo como está no loop, ele lê o arquivo uma vez, e o progressBar não é preenchido e nem a label que calcula a porcentagem, ai depois de ler esta primeira vez, ele preenche como 1% e lê tudo de novo, ai depois com 2% e gera o backup tudo de novo e assim vai... ele não acompanha na medida q é feito o backup.

     

    Segue o codigo:

     

    Private Sub frm_bkpSql_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        BackgroundWorker1.WorkerReportsProgress = True
        BackgroundWorker1.WorkerSupportsCancellation = True
    
        Me.BackgroundWorker1.RunWorkerAsync(9999)
    

     

    Evento Work:

     

    Try
          carregaInfo.CarregaXML()
          Dim strBkp As String
    
          Dim dataFormatada As String
    
          dataFormatada = Date.Today.ToString(Format("dd" & "_" & "MM" & "_" & "yyyy"))
    
          strBkp = "BACKUP DATABASE [" & carregaInfo.banco & "] TO DISK = N'" & carregaInfo.bkpDest & "' WITH INIT, NAME= N'" & carregaInfo.banco & "_Bkp_CampelloIT_" & dataFormatada & "';"
          comandoSQL = New SqlCommand
          carregaInfo.conexao()
    
          For i As Integer = 0 To 100
            BackgroundWorker1.ReportProgress(i)
            Threading.Thread.Sleep(10)
    
            If BackgroundWorker1.CancellationPending <> True Then
              comandoSQL.CommandText = strBkp
              comandoSQL.Connection = carregaInfo.conexaoSQL
              comandoSQL.ExecuteNonQuery()
    
            Else
              e.Cancel = True
              Exit For
            End If
          Next
    
        Catch ex As Exception
          MsgBox("Ocorreu um erro ao executar o backup." & vbCrLf & ex.Message)
    
        End Try

     

    Se eu insiro dentro do IF:

    BackgroundWorker1.ReportProgress(i)

    Threading.Thread.Sleep(10)

     

    continua na mesma. Não muda o cenário.

     

    O que fazer para o BackgroundWorker ser preenchido na medida que for salvando o backup no destino?


    Lucas Araújo.
    sexta-feira, 30 de abril de 2010 19:59

Respostas

  • Não vai influenciar o ExecuteReader() ou ExecuteNonQuery, pois quando vc chama esses métodos, ele vai executar todo o backup e apenas quando o backup finalizar o método Execute vai retornar.

    Desta forma não tem como fazer o progress que vc quer.


    Quem sabe um dia os DataSets se extinguirão?
    sexta-feira, 7 de maio de 2010 16:04

Todas as Respostas

  • Vc deve tratar o evento do BackgroundWorker. Adicione um handler ao evento.

    addhandler BackgroundWorker.ProgressChanged, addressof handler_progresschanged


    Quem sabe um dia os DataSets se extinguirão?
    sexta-feira, 30 de abril de 2010 20:06
  • Bom dia,

    Havia esquecido de postar o ProgressChanged. Mais o problema ocorre que ele realiza o backup, mais não mostra o status na ProgressBar, só quando completa o backup que começa a ser exibido o status no ProgressBar, porém inicia todo o processo de backup novamente.

    Ex.: O arquivo de 80mb no SQL é gerado para arquivo no formato .BAK em uma pasta do windows. Ao completar seus 80mb por exemplo no destino e não ser exibido nada na ProgressBar neste decorrer; estes 80mb são iniciados do zero novamente e assim por diante é exibido na progressbar, porém com uma demora maior.

     

    Segue o codigo da ProgressChanged:

     

     Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        
        Try
          Me.ProgressBar1.Value = e.ProgressPercentage
          lbl_porc.Text = (ProgressBar1.Value * 100) / ProgressBar1.Maximum & "%"
    
        Catch ex As Exception
          MsgBox("Ocorreu um problema ao efetuar o backup." & ex.Message, MsgBoxStyle.Critical, "Erro")
        End Try
        
        
      End Sub


    Lucas Araújo.
    segunda-feira, 3 de maio de 2010 11:51
  • Nenhuma dica?
    Se este resposta o ajudou de alguma maneira, marque como ÚTIL para ajudar os visitantes. Lucas Araújo.
    segunda-feira, 3 de maio de 2010 20:05
  • Acho q vc está com um problema em sua lógica. Esta linha não é assincrona:

    comandoSQL.ExecuteNonQuery()

    Então enquanto não terminar o Backup ele não vai sair daqui, então vc não ira conseguir mostrar o progress. Terá que pensar em outra forma de realizar o backup.


    Quem sabe um dia os DataSets se extinguirão?
    terça-feira, 4 de maio de 2010 18:50
  • Alguma sugestão??

    Tentei como ExecuteReader entre outros, porém sem sucesso.


    Lucas Araújo.
    terça-feira, 4 de maio de 2010 21:15
  • Não vai influenciar o ExecuteReader() ou ExecuteNonQuery, pois quando vc chama esses métodos, ele vai executar todo o backup e apenas quando o backup finalizar o método Execute vai retornar.

    Desta forma não tem como fazer o progress que vc quer.


    Quem sabe um dia os DataSets se extinguirão?
    sexta-feira, 7 de maio de 2010 16:04