[firebase-br] Firebird .NET Data Provider

Marcos Weimer marcosweimer em gmail.com
Seg Abr 25 15:32:05 -03 2011


Ola!

Estou tendo problemas com transaction no .net data provider.

Estou desenvolvendo um atualizador de banco que pega a versão de um
webservice e atualiza.

O bloco de atualização esta assim...

                    if (conexaoUPD.State == ConnectionState.Open) //se
tem conexao e esta aberta...
                    {
                        FbTransaction tr; //cria e inicia a transacao
                        tr = conexaoUPD.BeginTransaction();

                        StringBuilder sbErros = new StringBuilder();
//string builder que recebe os erros
                        Boolean erro = false;
                        FbCommand qUpd = new FbCommand();
                        qUpd.Connection = conexaoUPD;
                        qUpd.CommandType = CommandType.Text;
                        qUpd.Transaction = tr; //seta a transacao

                         //passa registro a registro
                        for (int z = 0; z < dv.Count; z++)
                        {
                            qUpd.CommandText = dv[z]["COMANDO"].ToString();
                            try
                            {
                                qUpd.ExecuteNonQuery(); //executa
                            }
                            catch (Exception ex)
                            {   //se ocorreu erro passa para o
stringbuilder e continua
                                sbErros.Append("ERRO UPD: \r\n");
                                sbErros.Append("BANCO: " +
servidor_banco + ":" + caminho_banco + "\r\n");
                                sbErros.Append("VERSAO: " +
dv[z]["VERSAO"].ToString() + "\r\n");
                                sbErros.Append("SEQ: " +
dv[z]["SEQ"].ToString() + "\r\n");
                                sbErros.Append("SQL: " + sql + "\r\n");
                                sbErros.Append("ERRO: " + ex.Message +
"\r\n\r\n");
                                erro = true;
                            }
                        }

                        try
                        {
                            if (erro)
                            {
                                tr.Rollback(); //se ocorreu erro...
faz o rollback
                                sbErros.Append("ROLLBACK\r\n");
                            }
                            else
                            {
                                tr.Commit();
                            }
                        }
                        catch (Exception ex)
                        {
                            sbErros.Append("ERRO COMMIT/ROLLBACK\r\n");
                            sbErros.Append(ex.Message);
                        }



O problema esta no tr.Rollback() ocorre um exception:
*invalid transaction handle (expecting explicit transaction start)*

a transação é iniciada logo ali no começo, ja trabalhei com transações no c#
(linguagem que estou aprendendo), no delphi não tenho problemas fazendo
transações deste tipo  (uma query com uma transação executar varios
comandos)

Pelo que diz neste site aqui:
http://web.archiveorange.com/archive/v/hKdPdZ6HxC71IkWQlHmA
la no final....

> " No. It's a limitation of Firebird itself. However you can do it in
> execute block."
>

Alguem ja passou por isso? sabe se realmente é uma limitação? Estranho que
no Delphi ja executei varios comandos em uma query (IBOQuery com uma conexão
e um IBOTransaction)
da mesma forma como estou tentando fazer agora no c#.

Isto é uma limitação do provider para o .NET ? ou o IBO que uso no delphi
que esta fazendo ?

vlw


-- 
-=Ma®©oS=-
Marcos R. Weimer
Puma GTE 1974 Tubarão



Mais detalhes sobre a lista de discussão lista