DUVIDAS NO LOOP

PERCIFILHO 01/06/2011 13:33:17
#375574
Boa tarde, pessoal.
Estou tentando fazer uma consulta assim:
Tabela Produtos: campo: medida
Tabela Movimentos: campos: data, medida, quantidade

Tenho que listar todas as saídas de todos os produtos.
Então eu percorro a tabela de Cadastro, pego a medida e abro a tabela de Movimentos, percorro a tabela e quando encontrar o registro correspondente, imprimo na tela.
Quando não houver mais movimentos desse produto, pego o próximo produto e faço a mesma coisa (loop).

A rotina que eu fiz está assim:

conexao.Open()
Dim cmdcadastro As SqlCommand
Dim drcadastro As SqlDataReader
cmdcadastro = New SqlCommand([Ô]Select * From Cadastro Order by medida[Ô], conexao)
drcadastro = cmdcadastro.ExecuteReader
Do While drcadastro.Read
Dim cmdconsulta As New SqlCommand
Dim drconsulta As SqlDataReader
cmdconsulta = New SqlCommand([Ô]Select * From Movimentos Where medida Like [ô][Ô] & drcadastro.Item([Ô]medida[Ô]) & [Ô][ô] And saida Is Null[Ô], conexao)
drconsulta = cmdconsulta.ExecuteReader
Do While drconsulta.Read
e.Graphics.DrawString(drconsulta.Item([Ô]data[Ô]) & Space(2) & CDbl(drconsulta.Item([Ô]quantidade[Ô])).ToString.PadLeft(4) & Space(4) & CDbl(drconsulta.Item([Ô]medida[Ô])).ToString([Ô]#0.00[Ô]).PadLeft(5), New Font([Ô]Courier New[Ô], 10, FontStyle.Regular), Brushes.Black, 200, 20)
Loop
Loop


Só que não dá certo. Aparece a mensagem:
There is already an open DataReader associated with this Command which must be closed first.

Alguém pode me dizer onde é que eu estou errando?

Até mais.
KERPLUNK 01/06/2011 13:46:24
#375578
Do While drconsulta.Read
e.Graphics.DrawString(drconsulta.Item([Ô]data[Ô]) & Space(2) & CDbl(drconsulta.Item([Ô]quantidade[Ô])).ToString.PadLeft(4) & Space(4) & CDbl(drconsulta.Item([Ô]medida[Ô])).ToString([Ô]#0.00[Ô]).PadLeft(5), New Font([Ô]Courier New[Ô], 10, FontStyle.Regular), Brushes.Black, 200, 20)
Loop
drconsulta.close()
drconsulta.dispose()
Loop
PERCIFILHO 01/06/2011 13:55:07
#375582
Ainda assim não deu.

conexao.Open()
Dim cmdcadastro As SqlCommand
Dim drcadastro As SqlDataReader
cmdcadastro = New SqlCommand([Ô]Select * From Cadastro Order by medida[Ô], conexao)
drcadastro = cmdcadastro.ExecuteReader
Do While drcadastro.Read
Dim cmdconsulta As New SqlCommand
Dim drconsulta As SqlDataReader
cmdconsulta = New SqlCommand([Ô]Select * From Movimentos Where medida Like [ô][Ô] & drcadastro.Item([Ô]medida[Ô]) & [Ô][ô] And saida Is Null[Ô], conexao)
[txt-color=#e80000] drconsulta = cmdconsulta.ExecuteReader [/txt-color]
Do While drconsulta.Read
e.Graphics.DrawString(drconsulta.Item([Ô]data[Ô]) & Space(2) & CDbl(drconsulta.Item([Ô]quantidade[Ô])).ToString.PadLeft(4) & Space(4) & CDbl(drconsulta.Item([Ô]medida[Ô])).ToString([Ô]#0.00[Ô]).PadLeft(5), New Font([Ô]Courier New[Ô], 10, FontStyle.Regular), Brushes.Black, 200, 20)
Loop
Loop


O erro aponta para a linha em em vermelho.
KERPLUNK 01/06/2011 14:01:59
#375583
No final do primeiro loop, vc tem que fechar o drconsulta
PERCIFILHO 01/06/2011 14:07:28
#375586
Fiz como você me explicou, porém ainda ocorre o erro citado acima, apontando para a linha em vermelho.
Como sou iniciante ainda em VB.Net devo não estar sabendo fazer essa pesquisa, ou fazendo de maneira errada.
De repente pode ser que haja uma maneira mais eficiente de fazer isso, sei lá, se puder(em) me ajudar, agradeço.
Até mais.
KERPLUNK 01/06/2011 14:11:01
#375588
A mensagem de erro, é bem clara:
There is already an open DataReader associated with this Command which must be closed first.
Traduzindo:
Já existe um datareader aberto associado com esse Command que deve ser fechado primeiro
PERCIFILHO 01/06/2011 14:16:26
#375591
Pois é, da maneira que você me falou, era para funcionar, mas não funciona. Após o primeiro Loop, eu escrevi drconsulta.close(), porém o datareader não fecha. Estou ficando louco, tentando de tudo, mas ainda não consegui. Vou continuar tentando. Valeu, qualquer coisa estamos aí.
Até mais.
PEGUDO 01/06/2011 14:58:33
#375605
Cara tira o

Dim cmdconsulta As New SqlCommand
Dim drconsulta As SqlDataReader


De dentro do loop
assim deve funcionar
PERCIFILHO 01/06/2011 15:08:34
#375607
Obrigado mas mesmo assim não deu.

Até mais.
PEGUDO 01/06/2011 15:17:21
#375608
Cara talvez seja esta linha

cmdconsulta = New SqlCommand([Ô]Select * From Movimentos Where medida Like [ô][Ô] & drcadastro.Item([Ô]medida[Ô]) & [Ô][ô] And saida Is Null[Ô], conexao)


Este [txt-color=#0000f0]New[/txt-color] deve estar atrapalhando porque você, a cada loop, pede um novo SQLCommand
e como você o fecha antes de fazer outro loop, ele dá o erro quando tenta abrir um novo Reader.

PERCIFILHO 01/06/2011 15:38:22
#375611
Será? E, sendo assim, como ficaria o código?
Repito: sou iniciante no VB.Net e ainda apanho muito com as mudanças.
Tópico encerrado , respostas não são mais permitidas