none
Transações RRS feed

  • Pergunta

  • Pessoal estou com uma divida sobre transações
    (begin - commit - roolbak)
    Tenho uma aplicação onde construi um bloco de codigo onde tenho que ter uma transação pois realizo uma serie de processos dentro dessa rotina mas dentro dessa rotina existem algumas consultas a tabelas e nessas consultas eu estou usando o dataReader mas ocorre um travamento do programa nesse ponto do dataReader

    Ex:
    Begin
    < ... comandos ... >
    aqui por exemplo tenho um dataReader que faz uma busca de registros
    nesse ponto ocorre travamento

    Se eu estiver dentro dessa transação antes do commit ocorre esse travamento estou usando C# Framework 3.5 e Banco de Dados Firebird sera que isso tem algo a ver com o Banco de Dados pois essa semana fiz um processo parecido com Banco de Dados Oracle e o travamento não ocorreu

     


    Junior
    terça-feira, 23 de março de 2010 12:11

Respostas

  • Ola

    Com certeza o problema esta no provedor de acesso entre o C# e o Firebird no driver mesmo pois ate no Access isso ja deu certo rss
    Foi como lhe disse no Firebird deu problema no Oracle, Access, SQL Server deu tudo certo e agora vc me dizendo que com Postgree tbm deu certo definitivamente o problema é com o drier mesmo.

    Dica: para eu contornar esse problema eu fiz o seguinte qualquer consulta extra eu fiz fora do inicio da transação e o que não tem jeito mesmo que tinha que ser feito dentro do bloco de transação eu usei o executescalar() do objeto commnad dai sim blza da certinho.

    Qto ao HasRows eu na verdade não o utilizo assim mas ele exibe se seu dataReader encontrou algum registro né e se vc fizer uma gambetinha não sei se vc ja fez isso mas usar assim
    if (!dr.HasRows == true) --> quem sabe não da certo

    Vlw pela dica e qualquer coisa se eu descobrir algo posto aqui tbm para mantermos atualizados

    Abs.

     


    Junior
    sexta-feira, 26 de março de 2010 16:10

Todas as Respostas

  • Júnior,

    Pode ser algum problema no provider sim, mas, não acredito que seja...

    Posta o código completo aí desse trecho pra ajudar a gente...


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    terça-feira, 23 de março de 2010 12:37
    Moderador
  • Junior td bem? Provavelmente o "log" do firebird seja menor que o do Oracle e por isso acontece em um e não no outro, poste seu codigo pois você pode esta carregando alem do necessario.
    terça-feira, 23 de março de 2010 16:48
  • Então eu tbm acho que seja algo referente ao provider pois foi como eu disse no projeto usando C# + Firebird tive probleas ja no projeto C# + Oracle não tive problemas com travamento.

    Falando sobre o travamento esse travamento que me refiro é o seguint eu abro uma transação BEGIN se eu fizer alguma consulta a uma tabela antes de disparar um commit meu sistema trava as requisições que uso são atraves de um dataReader.

    Codigo usado (aqui vou colocar um codigo pequeno pois o codigo que uso é um pouco extenso)

     

    if (clsado.cnTrans.State == ConnectionState.Closed) clsado.cnTrans.Open();
    cmdInsert =
    clsado.retCmd();
    cmdInsert.Connection =
    clsado.cnTrans;
    cmdInsert.Transaction =
    clsado.cnTrans.BeginTransaction();
    bTransacao =
    true;
    while (clsado.dr.Read())
       <aqui por exemplo faço uma query>
       sSQL = "Select Campo From Tabela Where Campo = variavel";
       cmd = clsado.retCmd();
       cmd.connection = cn;
       cmd.commandtext = sSQL;
       datareader = cmd.execurereader();
       if(datareader.read())
       {
             variavel_teste = datareader[0];
       }

    Na linha  if(datareader.read()) é que o programa trava, observe que esse codigo esta dentro do while na primeira passada o programa executa normalmente mas na segunda passada o programa trava e olha que eu fecho o datareader e destruo o objeto ainda

     

    Ja no Oracle isso funciona corretamente no firebird uma forma que achei para contornar foi o metodo executeescalar() com esse consigo executar normalmente e observe tbm que tenho uma variavel command (CMDINSERT) para a transação e uma variavel command (CMD) que uso para requeisições ao Banco de Dados nas querys.

    Esse é o codigo e o problema que tenho no programa se alguem tiver alguma dica ai agradeço

     

     

     

     

     

     

     


    Junior
    quarta-feira, 24 de março de 2010 17:12
  • Junior Bom Dia.

     

    Definitivamente o problema é com o FireBird ou a DLL do mesmo. Pois tinha um software funcionando perfeitamente com PostgreSQL entao passei ele para o FireBird ai ocorreu esse mesmo erro mais ainda n consegui resolver =/ ... sem falar que to com um problema tipo para testar um Datareader  tipo if (dr.HasRows == false) no firebird ele nunca busca false n sei pq a consulta vem vazia mas ele tras true... muito estranho. se alguem souber o pq se e algo q fiz errado no banco. e tals

     

    Junior pena n poder ajudar mas se eu resolver te mando a resposta

    Obrigado!

    sexta-feira, 26 de março de 2010 12:43
  • Ola

    Com certeza o problema esta no provedor de acesso entre o C# e o Firebird no driver mesmo pois ate no Access isso ja deu certo rss
    Foi como lhe disse no Firebird deu problema no Oracle, Access, SQL Server deu tudo certo e agora vc me dizendo que com Postgree tbm deu certo definitivamente o problema é com o drier mesmo.

    Dica: para eu contornar esse problema eu fiz o seguinte qualquer consulta extra eu fiz fora do inicio da transação e o que não tem jeito mesmo que tinha que ser feito dentro do bloco de transação eu usei o executescalar() do objeto commnad dai sim blza da certinho.

    Qto ao HasRows eu na verdade não o utilizo assim mas ele exibe se seu dataReader encontrou algum registro né e se vc fizer uma gambetinha não sei se vc ja fez isso mas usar assim
    if (!dr.HasRows == true) --> quem sabe não da certo

    Vlw pela dica e qualquer coisa se eu descobrir algo posto aqui tbm para mantermos atualizados

    Abs.

     


    Junior
    sexta-feira, 26 de março de 2010 16:10
  • junior gostaria de ver seu codigo....

     

    utilizei tran..  e funciono perfeitamente agora. 

    mas utilizei diferente.

    se me manda o seu codigo todo ali na parte do query ....posso tenta ver algo ...

    segunda-feira, 29 de março de 2010 18:02
  • Vc deve verificar o parametro que está passando para o BeginTransaction().

    No seu caso vc não passa nada, então ele utiliza o valor default. Verifique o parametro talvez seja o nivel da sua transação que esteja dando problema.


    Se sua pergunta foi respondida por favor marque a resposta como certa.
    sexta-feira, 9 de abril de 2010 22:33