Usuário com melhor resposta
Problema em Consulta Sql com thread

Pergunta
-
Estou tendo um problema que por enquanto sem solução! tenho que fazer duas consultas simultaneas na mesma tabela e retornar uma informacao para cada consulta fiz as Threads e as consultas porem quando executas da o seguinte erro:
Que o dataread esta aberto para conexao e nao consigo executar as threads corretamente o que devo fazer? segue o codigo!
Imports MySql.Data.MySqlClient
Public Class Form1
Dim cn As MySqlConnection
Dim dataad As MySqlDataAdapter
Dim ds As DataSet
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim ctThread As Threading.Thread = New Threading.Thread(AddressOf conecta)
ctThread.Start()
Dim ctThread1 As Threading.Thread = New Threading.Thread(AddressOf conecta1)
ctThread1.Start()
End Sub
Sub conecta()
Using cn As New MySqlConnection("Data Source=" + "localhost" + ";user id=" + "root" + ";password=" + "" + "; database=" + "teste")
dataad = New MySqlDataAdapter("select * from usuarios where email = 'clienteA", cn)
ds = New DataSet
dataad.Fill(ds, "usuarios")
MsgBox(ds.Tables("usuarios").Rows(0).Item("telefone").ToString)
End Using
End Sub
Sub conecta1()
Using cn As New MySqlConnection("Data Source=" + "localhost" + ";user id=" + "root" + ";password=" + "" + "; database=" + "teste")
dataad = New MySqlDataAdapter("select * from usuarios where email = 'ClienteB'", cn)
ds = New DataSet
dataad.Fill(ds, "usuarios")
MsgBox(ds.Tables("usuarios").Rows(0).Item("telefone").ToString)
End Using
End Sub
End Class
Respostas
-
Cara, esse código tá meio estranho, pois você faz dois métodos parecidos mas em resumo o que acontece é que as threads estão muito rápidas e você usa o mesmo objeto de BD na memória para as duas, o ideal seria você esperar acabar a primeira para depois fazer a segunda, você pode fazer isso por meio de um Join, dessa forma:
Dim ctThread As Threading.Thread = New Threading.Thread(AddressOf conecta) ctThread.Start() ctThread.Join() Dim ctThread1 As Threading.Thread = New Threading.Thread(AddressOf conecta1) ctThread1.Start()
Abraços!
Thiago Coelho - Líder das Comunidades .NET Coders e Windows 8 Brasil
thiagocoelho.net | @thiagokoelho- Marcado como Resposta Ricardo RussoModerator quarta-feira, 6 de fevereiro de 2013 13:01
-
Esse codigo ta bem confuso!
Pra que voce ta usando threads dessa maneira?
oque voce pode fazer é usar a palavra chave Using assim que um objeto terminar de ser usado ele ja é eliminado da memoria,sem precisa dar um 'dispose' entao,em teoria o seu codigo ficaria da seguinte estrutura:
dim _con as new sqlconnection = _suaString Using comando as new sqlcommand("Select aqui",_con) Try 'abre uma conexao _con.open() dim dr as new dataread = comando.executereader dr.read if(dr.hashow) then 'seu codigo end if catch ex as exception msgbox("erro " & err.description) finally 'é sempre bom finalizar a conexao a cada transação _con.close() end try 'aqui termina a vida de todos os objetos usados. End Using
Só adaptar os outros selects da mesma maneira.
Microsoft Technology Associate (MTA)
Eduardo, nesse caso o Using não vai no Command e sim na Connection, não precisa chamar o Dispose pois o Using já implementa IDisposable:
Using _con as new sqlconnection(_suaString) Try Dim comando as new sqlcommand("Select aqui", _con) 'abre uma conexao _con.open() dim dr as new dataread = comando.executereader While dr.read if(dr.hashow) then 'seu codigo end if End While catch ex as exception msgbox("erro " & ex.Message) end try 'aqui termina a vida de todos os objetos usados. End Using
Thiago Coelho - Líder das Comunidades .NET Coders e Windows 8 Brasil
thiagocoelho.net | @thiagokoelho- Marcado como Resposta Ricardo RussoModerator quarta-feira, 6 de fevereiro de 2013 13:01
Todas as Respostas
-
Cara, esse código tá meio estranho, pois você faz dois métodos parecidos mas em resumo o que acontece é que as threads estão muito rápidas e você usa o mesmo objeto de BD na memória para as duas, o ideal seria você esperar acabar a primeira para depois fazer a segunda, você pode fazer isso por meio de um Join, dessa forma:
Dim ctThread As Threading.Thread = New Threading.Thread(AddressOf conecta) ctThread.Start() ctThread.Join() Dim ctThread1 As Threading.Thread = New Threading.Thread(AddressOf conecta1) ctThread1.Start()
Abraços!
Thiago Coelho - Líder das Comunidades .NET Coders e Windows 8 Brasil
thiagocoelho.net | @thiagokoelho- Marcado como Resposta Ricardo RussoModerator quarta-feira, 6 de fevereiro de 2013 13:01
-
Esse codigo ta bem confuso!
Pra que voce ta usando threads dessa maneira?
oque voce pode fazer é usar a palavra chave Using assim que um objeto terminar de ser usado ele ja é eliminado da memoria,sem precisa dar um 'dispose' entao,em teoria o seu codigo ficaria da seguinte estrutura:
dim _con as new sqlconnection = _suaString Using comando as new sqlcommand("Select aqui",_con) Try 'abre uma conexao _con.open() dim dr as new dataread = comando.executereader dr.read if(dr.hashow) then 'seu codigo end if catch ex as exception msgbox("erro " & err.description) finally 'é sempre bom finalizar a conexao a cada transação _con.close() end try 'aqui termina a vida de todos os objetos usados. End Using
Só adaptar os outros selects da mesma maneira.
Microsoft Technology Associate (MTA)
-
Esse codigo ta bem confuso!
Pra que voce ta usando threads dessa maneira?
oque voce pode fazer é usar a palavra chave Using assim que um objeto terminar de ser usado ele ja é eliminado da memoria,sem precisa dar um 'dispose' entao,em teoria o seu codigo ficaria da seguinte estrutura:
dim _con as new sqlconnection = _suaString Using comando as new sqlcommand("Select aqui",_con) Try 'abre uma conexao _con.open() dim dr as new dataread = comando.executereader dr.read if(dr.hashow) then 'seu codigo end if catch ex as exception msgbox("erro " & err.description) finally 'é sempre bom finalizar a conexao a cada transação _con.close() end try 'aqui termina a vida de todos os objetos usados. End Using
Só adaptar os outros selects da mesma maneira.
Microsoft Technology Associate (MTA)
Eduardo, nesse caso o Using não vai no Command e sim na Connection, não precisa chamar o Dispose pois o Using já implementa IDisposable:
Using _con as new sqlconnection(_suaString) Try Dim comando as new sqlcommand("Select aqui", _con) 'abre uma conexao _con.open() dim dr as new dataread = comando.executereader While dr.read if(dr.hashow) then 'seu codigo end if End While catch ex as exception msgbox("erro " & ex.Message) end try 'aqui termina a vida de todos os objetos usados. End Using
Thiago Coelho - Líder das Comunidades .NET Coders e Windows 8 Brasil
thiagocoelho.net | @thiagokoelho- Marcado como Resposta Ricardo RussoModerator quarta-feira, 6 de fevereiro de 2013 13:01