none
Problema em Consulta Sql com thread RRS feed

  • 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

    quarta-feira, 30 de janeiro de 2013 04:16

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

    quarta-feira, 30 de janeiro de 2013 11:36
  • 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

    quarta-feira, 30 de janeiro de 2013 12:03

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

    quarta-feira, 30 de janeiro de 2013 11:36
  • 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)

    quarta-feira, 30 de janeiro de 2013 11:48
  • 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

    quarta-feira, 30 de janeiro de 2013 12:03