Usuário com melhor resposta
Transações

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 dataReaderEx:
Begin
< ... comandos ... >
aqui por exemplo tenho um dataReader que faz uma busca de registros
nesse ponto ocorre travamentoSe 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
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 certoVlw pela dica e qualquer coisa se eu descobrir algo posto aqui tbm para mantermos atualizados
Abs.
Junior- Marcado como Resposta AndreAlvesLimaModerator domingo, 28 de março de 2010 13:02
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 -
-
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 -
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!
- Sugerido como Resposta AndreAlvesLimaModerator sexta-feira, 26 de março de 2010 15: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 certoVlw pela dica e qualquer coisa se eu descobrir algo posto aqui tbm para mantermos atualizados
Abs.
Junior- Marcado como Resposta AndreAlvesLimaModerator domingo, 28 de março de 2010 13: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.