PROGRESS BAR

JOHNHEY 29/06/2011 19:49:22
#378064
Boa Noite pessoal, tenho um probleminha aqui e espero que possam me ajudar.

Tenho uma tela de abertura
e nela coloquei um progressbar para verificar o bd

o código é este:

Imports System.Data.SqlClient
Public Class frmabertura
[ô]Criação de variaveis
Dim totalrows As Integer
Dim dt As New DataTable
Dim drr As SqlDataReader
Dim cmd As New SqlCommand
Dim adtp As New SqlDataAdapter
[ô]criação de variavel para localizar o caminho onde esta o bd
Dim linha As String = Application.StartupPath & [Ô]\SIAF.mdf[Ô]
Dim conn As New SqlConnection([Ô]Data source=.\SQLEXPRESS;AttachDbFilename=[Ô] & linha & [Ô];Integrated Security=True;User Instance=True[Ô])

Private Sub frmabertura_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
[ô]conecta o bd
Dim conexao As New conexaoBD
conexao.sconectar()
conn.Open()
VerificaTabela([Ô]TBEstadocivil[Ô], [Ô]Registo[Ô], [Ô]Estado Civil[Ô])
VerificaTabela([Ô]TBAgente[Ô], [Ô]Registo[Ô], [Ô]de Agentes[Ô])
Catch EX As Exception
MsgBox([Ô]erro - [Ô] + EX.Message)
End Try
End Sub

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Try
With drr.Read
dt.Load(drr)
totalrows = dt.Rows.Count + 1
End With
For Value As Integer = 0 To totalrows
BackgroundWorker1.ReportProgress(Value, Nothing)
Threading.Thread.Sleep(0.1)
Next
Catch EX As Exception
MsgBox([Ô]erro - [Ô] + EX.Message)
End Try
End Sub

Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
Try
ProgressBar1.Maximum = totalrows
ProgressBar1.Value = e.ProgressPercentage
Catch EX As Exception
MsgBox([Ô]erro - [Ô] + EX.Message)
End Try
End Sub
Private Sub VerificaTabela(ByVal Tabela As String, ByVal CampoOrder As String, ByVal Nome As String)
Try
cmd.CommandText = [Ô]SELECT * FROM [Ô] & Tabela & [Ô] [Order [Ô] & CampoOrder & [Ô]][Ô]
cmd.Connection = conn
drr = cmd.ExecuteReader
BackgroundWorker1.RunWorkerAsync()
lblcarregar.Text = [Ô]Verificando Tabela [Ô] & Nome & [Ô]...[Ô]
Catch EX As Exception
MsgBox([Ô]erro - [Ô] + EX.Message)
End Try
End Sub

e o erro é o seguinte:

There is already an open DataReader associated with this Command which must be closed first.

This BackgroundWorker is currently busy and cannot run multiple tasks concurrently.
TECLA 29/06/2011 20:43:40
#378068
Qual é a linha do erro?
JOHNHEY 30/06/2011 10:57:24
#378128
drr = cmd.ExecuteReader 1º erro: Já existe um DataReader aberto associado a este Command, que tem de ser fechado primeiro.

BackgroundWorker1.RunWorkerAsync() 2º Erro: Este BackgroundWorker está actualmente ocupado e não pode executar várias tarefas ao mesmo tempo.

A partir do segundo erro não passa.
GUIMORAES 01/07/2011 09:00:38
#378190
Olá Johney.
Bom dia!

Bom, faz assim:

Private Sub frmabertura_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
[ô]conecta o bd
Dim conexao As New conexaoBD
conexao.sconectar()
conn.Open()
VerificaTabela([Ô]TBEstadocivil[Ô], [Ô]Registo[Ô], [Ô]Estado Civil[Ô])
[txt-color=#007100] [ô] VerificaTabela([Ô]TBAgente[Ô], [Ô]Registo[Ô], [Ô]de Agentes[Ô]) DEIXE ESTE PROCEDIMENTO COMO COMENTARIO, PARA VERIFICAR SE DARÁ CERTO[/txt-color].
Catch EX As Exception
MsgBox([Ô]erro - [Ô] + EX.Message)
End Try

Bom, se der certo, é que antes, o backgroundworker estave executando as duas sub[ô]s de uma vez, e ocorria este problema.
creio que seja isto.

T+
JOHNHEY 01/07/2011 10:10:59
#378194
Boa tarde, GUIMORAES123 realmente não dá erro se eu coloco como comentário, funciona na perfeição.

Só que preciso colocar todas as tabelas, neste exemplo tenho somente duas mas terei que colocar mais de 10, e é ai que esta o problema, quando coloco para executar mais que uma dá o erro.
Terei que colocar as seguintes linhas:

exemplo:

VerificaTabela([Ô]TBEstadocivil[Ô], [Ô]Registo[Ô], [Ô]Estado Civil[Ô])
VerificaTabela([Ô]TBAgente[Ô], [Ô]Registo[Ô], [Ô]de Agentes[Ô])
VerificaTabela([Ô]TBPais[Ô], [Ô]Registo[Ô], [Ô]Pais[Ô])
VerificaTabela([Ô]TBRuas[Ô], [Ô]Registo[Ô], [Ô]de Ruas[Ô])
VerificaTabela([Ô]TBlocalidade[Ô], [Ô]Registo[Ô], [Ô]localidade[Ô])
VerificaTabela([Ô]TBFreguesia[Ô], [Ô]Registo[Ô], [Ô]Freguesia[Ô])
VerificaTabela([Ô]TBconcelho[Ô], [Ô]Registo[Ô], [Ô]concelho[Ô])
VerificaTabela([Ô]TBDistrito[Ô], [Ô]Registo[Ô], [Ô]distrito[Ô])

Sabe como posso fazer?
GUIMORAES 02/07/2011 12:04:58
#378292
Olá Johnhey.

Tenta fazer o seguinte, a cada processo, cancela o backgroundworker.

BackgroundWorker1.CancelAsync

você deve habilitar a opção WorkersupportsCancellation para TRUE.

Bom, creio que resolva o problema.
sobre o datareader, tenta fechar ele tambem, pois ao entrar em outro processo, o anterior estará aberto.

Abraços
JOHNHEY 02/07/2011 18:58:59
#378320
o workersupportscancellation já esta como TRUE
ASHKATCHUP 05/07/2011 11:46:40
#378509
Resposta escolhida
O problema do colega é que o BackGround worker, como o nome ja diz, trabalha em background, no fundo, sem parar a aplicação.

E, por isso, gera erro. Ele cria uma thread e vai processando ela. Após criar a thread, ele continua o programa, que vai criar uma segunda, só que com o mesmo componente. Por isso da erro...

ASHKATCHUP 18/07/2011 10:04:21
#379424

<pseudocodigo>

Dim datareader as new sqldatareader
Dim i as integer
[ô]
TotalLinhas = dataReader.Rows.Count+1
[ô]
progressBar.Maximum = TotalLinhas
[ô]
For i = 0 to totallinhas
Progressbar.value = i
next
Tópico encerrado , respostas não são mais permitidas