none
derrubar conexão com o banco depois de cancel postback RRS feed

  • Pergunta

  • pessoal, existe um botão na minha tela que para o cancela o postback. por que isso? porque durante o processamento uma tabela é alimentada. 

    então a qualquer momento o usuário pode abortar o processamento. porém, é preciso também, derrubar a conexão com o banco. porque mesmo cancelando o postback da pagina, ainda continua inserindo na tabela.

    resumindo o que preciso, após cancelar o postback, é derrubar a conexão da aplicação com o banco de dados. não acho nada a respeito na net.


    como faço?
    terça-feira, 2 de abril de 2013 11:43

Todas as Respostas

  • Rafa se vc estiver com uma aplicação web, sempre trabalhamos desconectados com o banco, qdo vc quer fazer uma transação vc abre a conexão, faz a transação e depois fecha a conexão. Portanto sua dúvida não tem pq existir, agora se vc estiver fazendo uma aplicação windows forms esse cenário pode existir. 

    Junior

    terça-feira, 2 de abril de 2013 12:04
  • na aplicação web pode existir sim. deixa eu te explicar:

    eu tenho uma botão executar. nesse momento uma tabela está sendo "alimentada". o que acontece: na tela existem alguns filtros. então imagine que o usuário fez alguns filtros errados e clicou em executar. então ele quer cancelar o processamento que ele está fazendo e realizar um outro filtro, ou ele cancela o processamento por um outro motivo qualquer. e aí o que tem q acontecer com a aplicação: preciso cancelar o postback (isso hoje eu já faço) e depois "derrubar" a conexão da aplicação com o banco.

    aí eu te explico como estou fazendo (é da mesma forma q vc disse).

    abri minha conexão

        'aqui começa o processamento do botão executar

        'aqui uso meus valores que retornam do banco para fazer determinadas validações

    fecho minha conexão.

    ou seja, concorda que não tem como trabalhar desconectado do banco? porque se eu desconectar antes de usar os valores do banco vai dar erro? certo?

    por isso eu preciso "derrubar", fechar, matar... usa o termo que quiser... com o banco de dados. 

    e o que acontece? mesmo eu cancelando o postback da pagina, continua alimentando minha tabela, porque ao clicar no botão executar "deu um submit" e foi para o banco.

    entendeu?


    • Editado rafa-martin terça-feira, 2 de abril de 2013 12:21 e
    terça-feira, 2 de abril de 2013 12:19
  • É só trabalhar com transações, abre uma transação antes e se for cancelado você faz um rollback.

    using (IDbTransaction tran = conn.BeginTransaction()) {
       
    try {
            tran.Commit();
       
    }  catch {
            tran
    .Rollback();
           
    throw;
       
    }
    }

    terça-feira, 2 de abril de 2013 12:25
  • o problema guilherme é que o botão executar chama uma método. esse método chama um outro q executa uma porcedure. como eu vou fazer o rollback de um transação, em um outro botão, sendo o begintransaction está declarada em um método?
    terça-feira, 2 de abril de 2013 12:41
  • Pode ser que exista uma forma obscura para resolver esse problema, mas aqui, na logica basica, eu posso te dizer que não é possível dentro de uma mesma transação por um motivo: cliente - servidor.

    A questão envolve o básico do mecanismo da plataforma web: o cliente realiza uma requisição, ela é enviada ao servidor e este processa. A informação processada é retornada ao cliente e renderizada.

    Depois que a requisição solicitando os dados foi feita e o IIS está armazenando esses dados em memória para retornar ao cliente, não há um meio de você interferir. TALVEZ exista um meio usando computação paralela / assíncrona, mas sinceramente, não faço ideia de como isso pode ser feito e SE pode ser feito.

    Uma solução para descarregar grandes quantidades de dados na tela evitando a demora para o cliente é usar a descarga de buffer com o Response.Flush() OU o que eu faria, que é usar a paginação.

    Cancelar o PostBack é até fácil, pois você pode fazer isso direto no lado do cliente com JavaScript, mas diferente disso não sei se é possível fazer, porque você precisaria enviar ao servidor uma requisição a mais para comunicar o cancelamento da recuperação dos dados e ainda fechar a conexão no meio do caminho. 

    Melhor você mudar a estratégia.


    Rafael Santos

    Observações:
    1. Selecione a opção "Habilitar o Live Alerts por Padrão" nas suas configurações para que possa acompanhar em tempo real as atividades relacionadas a sua Thread;
    2. Não abandone sua Thread. Ao perguntar, fique atento às respostas; ao encontrar uma solução, compartilhe;
    3. As pessoas que dedicam seu tempo na busca por soluções para você não ganham nada em troca. Valorize-as e em forma de agradecimento pontue as respostas corretas.

    "Quem disse que não escrevo poesias? A diferença é que as minhas começam com using System;"

    terça-feira, 2 de abril de 2013 12:45
  • tem alguma outra então? porque não sei uma melhor forma.

    obs: o resultado não tem a ver com paginação. na verdade é apenas um processamento que alimente uma tabela para depois a mesma ser usando em outro processo.

    terça-feira, 2 de abril de 2013 12:52
  • Rafa eu não concordo, com o seu pensamento, a não ser que esse processo seja demorado mais ai vc teria que ver como parar ou dar um rollback na transação que seria o ideal, pq eu tenho essa situação mais é assim, nesse processo estou lendo um arquivo texto linha a linha ai caso em um linha eu encontre qualquer divergencia dou um rollback, note que não existe um botão para parar a execução, pois o evento esta no click do botão ele so executa outro evento qdo o primeiro acabar. vc pode fazer assim em vb.net

    Dim WL_OjConnection As SqlConnection
    Dim WL_OjCommand As SqlCommand
    Dim WL_OJCommand1 As SqlCommand
    Dim WL_OjTransaction As SqlTransaction
    Dim WL_OjDataReader As SqlDataReader
    
    try
    WL_OjConnection = New SqlConnection(CF_DSConexao)
    WL_OjConnection.Open()
    WL_OjTransaction = WL_OjConnection.BeginTransaction(IsolationLevel.ReadCommitted)
    WL_OjCommand = New SqlCommand
    WL_OjCommand.CommandTimeout = 154000
    WL_OjCommand.Connection = WL_OjConnection
    WL_OjCommand.Transaction = WL_OjTransaction
    
    WL_OJCommand1 = New SqlCommand
    WL_OJCommand1.CommandTimeout = 54000
    WL_OJCommand1.Connection = WL_OjConnection
    WL_OJCommand1.Transaction = WL_OjTransaction
    
    deu erro faço isso
    WL_OjTransaction.Rollback()
    WL_OjConnection.Close()


    Junior

    terça-feira, 2 de abril de 2013 12:52
  • Não tem como parar uma requisição ao IIS pela metade... Você teria que fazer uma OUTRA requisição enquanto a primeira está em andamento. É o que eu disse... TALVEZ com computação paralela ou assíncrona.

    Parando o PostBack você só para o navegador... mas não o IIS, por isso a tabela continua a ser alimentada.


    Rafael Santos

    Observações:
    1. Selecione a opção "Habilitar o Live Alerts por Padrão" nas suas configurações para que possa acompanhar em tempo real as atividades relacionadas a sua Thread;
    2. Não abandone sua Thread. Ao perguntar, fique atento às respostas; ao encontrar uma solução, compartilhe;
    3. As pessoas que dedicam seu tempo na busca por soluções para você não ganham nada em troca. Valorize-as e em forma de agradecimento pontue as respostas corretas.

    "Quem disse que não escrevo poesias? A diferença é que as minhas começam com using System;"



    • Editado Rafa Santos terça-feira, 2 de abril de 2013 12:58
    terça-feira, 2 de abril de 2013 12:55
  • junior mais nesse caso vc não está usando dados do banco.
    terça-feira, 2 de abril de 2013 12:56
  • estou tentando usar o begin transaction para fazer um teste:

    Dim comando As New SqlCommand
            Dim tran As SqlTransaction

            connection.BeginTransaction()

            Try


                comando.CommandText = "proc"
                comando.CommandType = CommandType.StoredProcedure
                comando.Connection = connection
                comando.CommandTimeout = 3600


                comando.Parameters.Add("@param", SqlDbType.VarChar, 10).Value = IIf(pParam = "", DBNull.Value, pParam)

                comando.ExecuteNonQuery()

                tran.Commit()

            Catch ex As Exception

                strMensagem = ex.Message.ToString()
                HttpContext.Current.Session("Mensagem") = ex.Message.ToString()
                strMensagem = String.Empty

            End Try

            'strMensagem = String.Empty
        End Sub

    só que está me dando o seguinte erro: ExecuteNonQuery requires the command to have a transaction when the connection assigned to the command is in a pending local transaction...

    mais eu iniciei. 

    terça-feira, 2 de abril de 2013 13:04
  • é como eu te falei e o Rafa Santos está falando, uma vez o processo sendo disparado no servidor não tem como vc para-lo no meio, no meu caso estou lendo um arquivo texto linha a linha é diferente de um processo executando no servidor iis e eu para-lo em um ponto qualquer. No meu caso leio o arquivo e vou gravando em um tabela, vamos supor que eu gravei uma linha no banco, qdo estou lendo a segunda linha no arquivo texto eu encontro um erro eu disparo o roolback e desfaço a gravação do registro gravado na tabela.

    Deu pra vc entender ?


    Junior

    terça-feira, 2 de abril de 2013 13:08
  • eu entendi e já sei disso.

    eu pensei em fazer de outra forma. o que eu quero saber é porque está dando esse erro.

    estou fazendo de outra forma.

    terça-feira, 2 de abril de 2013 13:14
  • já vi o erro. esqueci de colocar isso: tran = connection.BeginTransaction()
    terça-feira, 2 de abril de 2013 13:17
  • possuem algum sugestão?
    terça-feira, 2 de abril de 2013 13:21
  • de qualquer forma obrigado.

    vou pensar numa forma para tentar "burlar".

    value a todos.

    terça-feira, 2 de abril de 2013 13:35