Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Eric Beltrame de Lima

Erro - DATAREADER

Recommended Posts

Bom dia pessoal.
Novo problema, mas agora com um DataReader.

Erro
Ocorreu uma exceção sem tratamento do tipo 'System.InvalidOperationException' em System.Data.dll
Informações adicionais: Já existe um DataReader aberto associado a este Command que deve ser fechado primeiro.


O Erro ocorre no item indicado, o primeiro DataReader ( "rs" ) funciona, mas quando chega no segundo ( "rsAux" ) dá o erro acima.
Mas como podemos ver, são DataReader diferentes.
A unica coisa que dá certo é fechar o Using Comando: 'Abre - Comando "Busca Cliente"
mas se eu fizer isso eu perco o LOOP do Comando "Busca Cliente"

Alguém tem alguma ideia de como resolver isso?

Segue o Código
'Em um Modulo
------------------------------------------------------------------------
Public Conn As New SqlConnection
Public rs As SqlDataReader
Public Comando As New SqlCommand

Public rsAux As SqlDataReader
Public ComandoAux As New SqlCommand
------------------------------------------------------------------------

'Em um botão no Form:
Using Comando As New SqlClient.SqlCommand 'Abre - Comando "Busca Cliente"
With Comando
.Connection = Conn
.CommandType = CommandType.Text
.CommandText = "Select * from vwCliente order by Cliente"
rs = .ExecuteReader

'Loop para passar em todos os processos (Clientes)

If rs.HasRows = True Then 'Se houver registro
While rs.Read 'Abre Loop - "Clientes"
'Carrega cadastro básico do cliente
wIdFTP = rs!idftp 'Código do cliente
wFTP = rs!Cliente 'Nome do Cliente
wPastaArquivo_Des = strNulo(rs!Destino, Path.GetPathRoot("C:\")) 'Pasta Destino
wPastaArquivo_Ori = strNulo(rs!Origem, Path.GetPathRoot("C:\")) 'Pasta Origem

'-----------------------------------------------------------------------------------------------------------
'Carrega lista de e-Mail
Using ComandoAux As New SqlClient.SqlCommand 'Abre - Camando "Busca e-Mail"

With ComandoAux
.Connection = Conn
.CommandType = CommandType.Text
.CommandText = "Select email from parametro_email where idFtp = " & wIdFTP & " and ativo='True'"

rsAux = .ExecuteReader

If rsAux.HasRows = True Then
While rsAux.Read 'Abre Loop - "e-Mail"
wEmailCliente = wEmailCliente & ";" & rsAux!email
lstLog.Items.Add(rsAux!email)
lstLog.SelectedIndex = lstLog.Items.Count - 1
wEmailCliente = rsAux!email
End While 'Fecha Loop - "e-Mail"
End If
rsAux.Close()
End With

End Using 'Fecha - Camando "Busca e-Mail"
'-------------------------------------------------------------------------------------------------------------

End While 'Fecha Loop - "Clientes"
End If
rs.Close()
End With
End Using 'Fecha - Camando "Busca Cliente"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente duas soluções:

 

Primeiro abra as conexões antes de começar a tarefa e feche-as assim que a tarefa terminar, depois faça o mesmo no outro bloco.

 

Passe o "rs.Close()" para o bloco onde o Datareader rs está localizado, fazendo exatamente como no segundo bloco, ao terminar a tarefa feche tudo, conexão e datareader.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela resposta.

Mas o que acontece é que eu não posso fechar o primeiro bloco pois preciso dele para rodar o loop dentro do

Comando.CommandText = "Select * from vwCliente order by Cliente"

 

Que traz as informações desse próximo comando (alimentando a variavel wIdFTP)

ComandoAux.CommandText = "Select email from parametro_email where idFtp = " & wIdFTP & " and ativo= 'True' "

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas você não precisa do datareader para isso, você pode ler diretamente do banco de dados, a unica coisa que você precisa fazer é abrir a conexão e rodar o comando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.