[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