Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

João Fernandes dos Santos

The server failed to resume the transaction

Recommended Posts

Pessoal, boa tarde.

Estou recebendo esse erro quando executo meu sistema web. o erro acontece sempre que rodo um código de datareader segue o código abaixo.

 

Public Function DataReader(ByVal paramSql As String) As SqlDataReader
       
        cnn = New SqlConnection(MegaConnectionString)
        Strsql = paramSql
        cmd = New SqlCommand(Strsql, cnn)
        cmd.CommandType = System.Data.CommandType.Text


        Try
            cnn.Open()
            cmd.ExecuteNonQuery()
            myDr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection)
        Catch ex As Exception
            Throw New Exception(ex.Message.Trim, ex)

        End Try



        Return myDr
    End Function

Alguem sabe se essa função esta correta? essa função fica em um módulo e chamo ela no codebehind das páginas.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas ai é simples, você tem sua conexão, vou refazer um bloco aqui e você adapta no seu código:

 

 

Dim con As New SqlConnection("Sua Connection String")
Dim com As New SqlCommand("Comando SQL",con)
Dim dr As DataReader


con.Open()


dr = com.ExecuteReader()


If dr.HasRows Then


dr.Read()


End If


Dim resultado as String = dr("nomedacoluna")


dr.close()


con.Close()

Existem outros métodos de você pegar uma coluna direto pelo indice dela:

 

http://www.dreamincode.net/forums/topic/98106-datareader-getting-data/

http://www.microsoft.com/brasil/msdn/Tecnologias/vbnet/DataReader.mspx

Compartilhar este post


Link para o post
Compartilhar em outros sites

khaos, o complicado é que minha função esta em um módulo e não posso fazer o close dentro da função pois minha função tem um Return que envia os dados para a página que solicitou, senão, não consigo acessar o mydr("nomedacoluna") no code behind de minha página.

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas eu fecho ela, antes ou depois do Return?



Fiz o teste, quando em coloco antes para fechar a conexão: conforme código abaixo.

 

Public Function DataReader(ByVal paramSql As String) As SqlDataReader
        'CarregaStringConexao()
        Dim cnn As New SqlConnection(MegaConnectionStringReader)
        Strsql = paramSql
        cmd = New SqlCommand(Strsql, cnn)
        cmd.CommandType = System.Data.CommandType.Text
        Try
            cnn.Open()
            cmd.ExecuteNonQuery()
            myDr = cmd.ExecuteReader()
        Catch ex As Exception
            Throw New Exception(ex.Message.Trim, ex)

        Finally
            cnn.Close()
            cnn.Dispose()
            cmd.Dispose()
        End Try
       
        Return myDr

        'Libera os objetos da memória.
      
     
    End Function

 

 

dá erro na página que chama a função: fala que o datareader esta fechado:

 

E quando coloco para fechar a conexão depois do Return, ele nem chega a executar os códigos e simplesmente quando chega no return ele ja vai para o END FUNCTION.

 

Segue o código:

    Public Function DataReader(ByVal paramSql As String) As SqlDataReader
        'CarregaStringConexao()
        Dim cnn As New SqlConnection(MegaConnectionStringReader)
        Strsql = paramSql
        cmd = New SqlCommand(Strsql, cnn)
        cmd.CommandType = System.Data.CommandType.Text
        Try
            cnn.Open()
            cmd.ExecuteNonQuery()
            myDr = cmd.ExecuteReader()
        Catch ex As Exception
            Throw New Exception(ex.Message.Trim, ex)

      
        End Try
       
        Return myDr

        'Libera os objetos da memória.
        cnn.Close()
        cnn.Dispose()
        cmd.Dispose()

    End Function

 

Ta complicado resolver este problema, esse erro começou a aparecer agora, ele não aparecia antes. ja faz 1 ano que estou desenvolvendo essa aplicação e sempre rodou de boa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você não pode colocar nada depois do return, ele é o fim da função, nada é executado depois.

 

Você não precisa dar dispose nos comandos, eles fazem isso sozinhos. Onde está o mydr? Você tem que declará-lo dentro da função

 

 

Public Function DataReader(ByVal paramSql As String) As SqlDataReader       
        Dim cnn As New SqlConnection(MegaConnectionStringReader)
        Dim myDr As SqlDataReader
        cmd = New SqlCommand(paramSql, cnn)


        Try
            cnn.Open()
            myDr = cmd.ExecuteReader()


        Catch ex As Exception
            Throw New Exception(ex.Message.Trim, ex)
        
        Finally
        'Libera os objetos da memória.
        myDr.Close()
        cnn.Close()
        Return myDr
End Try
End Function

 

 

 

Tinha muita coisa desnecessária cara, você pode dar uma enxugada nesse código.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.