Usuário com melhor resposta
Transações !!!???!!!

Pergunta
-
Tenho um bloco de codigo com transação mas em um determinado local do meu codigo dentro dessa transação eu tenho uma query SQL para gerar um codigo autonumeração para ser usado em um insert que esta dentro da minha transação mas ele passa uma vez executa o codigo beleza mas segunda passada o sistema trava e não apresenta nenhum erro ... retirei a trasanção e tudo voltou a funcionar gostaria de saber qual a solução para isso
Estou usando VS2008 ; C# ; com Banco de Dados Firebird
Segue parte do codigo usado
cmdInsert.Transaction =
cnTrans.BeginTransaction();
< aqui faço meu primeiro INSERT INTO ... >
< ... segue o codigo ... >
< aqui faço mais um INSERT INTO ... >
// Abaixo faço a consulta que me referi que fica congelada pois essa rotina esta dentro de um laço
sSQL = "";
sSQL = "SELECT COALESCE(MAX(CODCR)+1,1) AS ID FROM CONTASRECEBER";
cmd = new FBCommand(); cmd.Connection = cn;
cmd.CommandText = ""; cmd.CommandText = sSQL;
drCr = cmd.ExecuteReader();
drCr.Read();
iIdCR = Convert.ToInt64(drCr[0]);
drCr.Close(); drCr.Dispose();
// A primeira vez que passa no codigo acima funciona mas na segunda passada ele trava bem na linha do crCr.Read() nesse ponto o cursor do debug some e o sistema congela
Como posso contornar esse problema isso se deu pelo uso da transação ja ate usei uma outra variavel de conexão auxiliar e nada da certo
Junior
Respostas
-
Junior,
Você não finalizou a transação em seu código.
FbTransaction.Commit
http://www.firebirdsql.org/dotnetfirebird/documentation/api/1.7/FirebirdSql.Data.Firebird.FbTransaction.Commit_overloads.html
Além disso, é mais simples utilizar o método ExecuteScalar ao invés de criar um reader.
FbCommand.ExecuteScalar
http://www.firebirdsql.org/dotnetfirebird/documentation/api/1.7/FirebirdSql.Data.Firebird.FbCommand.ExecuteScalar.html
Att.
Ari C. Raimundo- Marcado como Resposta Junior Martins sexta-feira, 18 de setembro de 2009 01:24
Todas as Respostas
-
Junior,
Você não finalizou a transação em seu código.
FbTransaction.Commit
http://www.firebirdsql.org/dotnetfirebird/documentation/api/1.7/FirebirdSql.Data.Firebird.FbTransaction.Commit_overloads.html
Além disso, é mais simples utilizar o método ExecuteScalar ao invés de criar um reader.
FbCommand.ExecuteScalar
http://www.firebirdsql.org/dotnetfirebird/documentation/api/1.7/FirebirdSql.Data.Firebird.FbCommand.ExecuteScalar.html
Att.
Ari C. Raimundo- Marcado como Resposta Junior Martins sexta-feira, 18 de setembro de 2009 01:24
-
Então mas é assim que funciona o negocio
BEGIN
< ... codigos ... >
aqui faço um codigo para gerar um valor autoincremento em uma tabela
mas o sistema entra no codigo que fica dentro de um laço mas ele entra uma vez e faz a busca do ultimo codigo
mas na segunda passada o programa congela
COMMIT
Eu não posso fechar minha transação no meio do caminho entende vou ate tentar usar o executeScalar pode ser uma saida
Junior -
Problema resolvido usei o ExecuteScalar() e deu tudo certo ...
Mas mesmo assim achei muito estranho a forma de tratamento de transações pois usei sempre no VB6 dessa maneira a qual descrevi e sempre funcionou bom também trata-se de uma outra arquitetura o .NET ... mas valeu pela dica e agora ja me acertei com a transação
Junior