DUVIDAS NO LOOP
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.
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.
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
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
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.
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.
No final do primeiro loop, vc tem que fechar o drconsulta
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.
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.
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
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
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.
Até mais.
Cara tira o
De dentro do loop
assim deve funcionar
Dim cmdconsulta As New SqlCommand
Dim drconsulta As SqlDataReader
De dentro do loop
assim deve funcionar
Obrigado mas mesmo assim não deu.
Até mais.
Até mais.
Cara talvez seja esta linha
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.
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.
Será? E, sendo assim, como ficaria o código?
Repito: sou iniciante no VB.Net e ainda apanho muito com as mudanças.
Repito: sou iniciante no VB.Net e ainda apanho muito com as mudanças.
Tópico encerrado , respostas não são mais permitidas