none
MYSQL : ERRO AO REALIZAR DUAS QUERYS E UM LOOP RRS feed

  • Pergunta

  • Senhores tenho uma solução usando um Banco Access, que roda o código abaixo sem problemas.

    Realizo a primeira consulta (SELECT) em uma tabela e com as informações preencho (INSERT) outra tabela usando um Loop.

    No Access roda sem problemas . Porem agora estou migrando a aplicação pro MYSQL e usando o mesmo trecho está dando o erro:

    there is already an open datareader associated with this command which must be closed first

    Então já tentei fechar a conexão, fechar o datareader,, dar um dispose, usar Finally e fechar a conexão no ao final do Loop utilizar o Using, usar o ExecuteReader(CommandBehavior.CloseConnection), abri e fechei a conexão em vários trechos  mas até agora nada.

    O máximo que eu consegui foi mudar o erro para : invalid attempt to call read when reader is closed , porém ao abrir dá o outro erro.

    Usando o mesmo código no ACCESS funciona direitinho embora talves não seja a melhor abordagem.

    Por isso pergunto aos Senhores: Como corrigir este código, onde está o erro, qual seria uma outra alternativa para pegar os dados de uma tabela e preencher outra usando um Loop? Segue o trecho do código que funciona com o Access, apenas alterando o Provider.

     Public Sub insertUserPermissao(ByVal userpermissao As UserPermissaoDTO)

     

                Try

                    If conn.State = ConnectionState.Open Then conn.Close()

                    conn.Open()

                    If conn.State = ConnectionState.Open Then conn.Close()

                    Dim sql As [String] = "SELECT * FROM MODULOS_TELAS"

                    Dim cmd As New MySqlCommand(sql, conn)

     

     

                    conn.Open()

     

                    Dim dr As MySqlDataReader

                    Dim telaspermissao As New ModulosTelasDTO

                    dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)

                    Do While dr.Read()

                        Dim ModuloCodigo As Integer = dr.Item("MODULO_ID")

                        Dim TelaCodigo As Integer = dr.Item("TELA_ID")

                        Dim TelaNome As String = dr.Item("TELA_NOME")

                        Dim TelaTipo As String = dr.Item("TELA_TIPO")

                        Try

     

                            Dim sql2 As [String] = "INSERT INTO USER_PERMISSAO (" & _

                                "PERFIL_ID," & _

                                "PERFIL_NOME," & _

                                "MODULO_ID," & _

                                "MODULO_ACESSO," & _

                                "TELA_ID," & _

                                "TELA_NOME," & _

                                "TELA_TIPO," & _

                                "PERMITE_ACESSO," & _

                                "PERMITE_VISUALIZAR," & _

                                "PERMITE_INCLUIR," & _

                                "PERMITE_EDITAR," & _

                                "PERMITE_IMPRIMIR," & _

                                "PERMITE_EXCLUIR," & _

                                "DATA_CAD," & _

                                "USER_LOGIN)" & _

                                " VALUES (" & _

                                "@perfilid," & _

                                "@perfilnome," & _

                                "@moduloid," & _

                                "@moduloacesso," & _

                                "@telaid," & _

                                "@telanome," & _

                                "@telatipo," & _

                                "@permiteacesso," & _

                                "@permitevisualizar," & _

                                "@permiteincluir," & _

                                "@permiteeditar," & _

                                "@permiteimprimir," & _

                                "@permiteexcluir," & _

                                "@datacad," & _

                                "@userlogin)"

     

     

                            Dim cmd2 As New MySqlCommand(sql2, conn)

                            cmd2.Parameters.AddWithValue("@perfilid", userpermissao.UserPermissaoPERFIL_ID)

                            cmd2.Parameters.AddWithValue("@perfilnome", userpermissao.UserPermissaoPERFIL_NOME)

                            cmd2.Parameters.AddWithValue("@moduloid", ModuloCodigo)

                            cmd2.Parameters.AddWithValue("@moduloacesso", userpermissao.UserPermissaoMODULO_ACESSO)

                            cmd2.Parameters.AddWithValue("@telaid", TelaCodigo)

                            cmd2.Parameters.AddWithValue("@telanome", TelaNome)

                            cmd2.Parameters.AddWithValue("@telatipo", TelaTipo)

                            cmd2.Parameters.AddWithValue("@permiteacesso", userpermissao.UserPermissaoPERMITE_ACESSO)

                            cmd2.Parameters.AddWithValue("@permitevisualizar", userpermissao.UserPermissaoPERMITE_VISUALIZAR)

                            cmd2.Parameters.AddWithValue("@permiteincluir", userpermissao.UserPermissaoPERMITE_INCLUIR)

                            cmd2.Parameters.AddWithValue("@permiteeditar", userpermissao.UserPermissaoPERMITE_EDITAR)

                            cmd2.Parameters.AddWithValue("@permiteimprimir", userpermissao.UserPermissaoPERMITE_IMPRIMIR)

                            cmd2.Parameters.AddWithValue("@permiteexcluir", userpermissao.UserPermissaoPERMITE_EXCLUIR)

                            cmd2.Parameters.AddWithValue("@datacad", userpermissao.UserPermissaoDATA_CAD)

                            cmd2.Parameters.AddWithValue("@userlogin", userpermissao.UserPermissaoUSER_LOGIN)

     

                            cmd2.ExecuteNonQuery()

                        Catch ex As Exception

                            MsgBox(ex.Message + "em insertUserPermissao")

                        End Try

     

                    Loop

                Catch ex As Exception

                    Throw ex

                Finally

                    conn.Close()

                End Try

            End Sub

     

    quarta-feira, 22 de dezembro de 2010 18:00

Respostas

Todas as Respostas

  • Joesan,

    Pelo que pesquisei, o provider para MySQL não permite que você tenha mais de um resultset ativo (Multiple Active Result Set - MARS), você deverá criar duas conexões para poder fazer isto que você está querendo.

    Só lembrando que é bom você usar o pool de conexões do ADO.NET, para isto é só usar a ConnectionString identica em todas as conexões.

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    • Marcado como Resposta JoeSan quarta-feira, 22 de dezembro de 2010 19:35
    quarta-feira, 22 de dezembro de 2010 18:26
    Moderador
  • Como vai Rogério,

    mais uma vez obrigado pela prontidão

    Estou usando :

    Public conn4 As New MySqlConnection("server=localhost;user id=root;Pwd=xxxx; database=imob; pooling=false;Connection Timeout=5")

        Public conn5 As New MySqlConnection("server=localhost;user id=root;Pwd=xxxx; database=imob; pooling=false;Connection Timeout=5")

     

    Na primeira usei a conn4 e na segunda dentro do Loop usei a conn5 porém tá dando o mesmo erro , seja com pooling=false ou true.

    Tem alguma outra sugestão.

    quarta-feira, 22 de dezembro de 2010 19:25
  • Foi mal Rogério na verdade estou marcando como resposta.

    Deu certo assim exatamente como você sugeriu. 

    Usando duas conexões.

     

    Na minha afobação tinha esquecido de alterar  : Dim cmd2 As New MySqlCommand(sql2, conn) mudei para

     Dim cmd2 As New MySqlCommand(sql2, conn5) e ai deu certo.

     

    Muito obrigado !

    Mais uma vez me ajudou muito.

    Até mais 

     

    quarta-feira, 22 de dezembro de 2010 19:40