[firebase-br] Erro Estranho: Execute Statement

Eduardo Jedliczka edujed em gmail.com
Seg Jan 17 09:28:32 -03 2011


Bom dia a todos,

Primeiramente, não consigo entender ou visualizar onde o DBX é melhor
que o IBO...

principalmente que o DBX por permitir aplicações "multi-banco" não faz
acesso realmente nativo e direto ao banco de dados, e não implementa
(ou melhor, utiliza) muitas características importantes do banco de
dados.

Será que usando DBX dá para fazer um backup (via serviço), verificar
se o banco está on-line (ou em modo shutdown), saber o tamanho do
page-size ?

Também não acredito que o DBX consiga entregar o mesmo desempenho do
IBO. Todos os teste de desempenho que já fiz até hoje provam o
contrário.

Além disto, não dá para usar comandos do Delphi como o QuotedStr
dentro de uma Procedure que está no banco.

Quanto à dúvida original do Salatiel, muitas coisas podem estar
ocorrendo, a primeira é a forma de passar parâmetros para o execute
statement. Como é uma Query Dinâmica, tente trocar o parâmetro pelo
seu valor. ou seja

varSQL = 'DELETE FROM TABELA WHERE EMPRESA = ' || I_EMPRESA ||'AND STATUS =
''N''';
EXECUTE STATEMENT varSQL;

Outro possível problema, é que talvez a sua transação seja Read Only,
ou esteja com algum "Lock" numa transação "No wait".

Há outras hipóteses, mas seria interessante mais detalhes para responder.

Abraço

Eduardo Jedliczka
Mestre em Ciências da Computação.

Em 16 de janeiro de 2011 20:59, Paulo Portella
<pportellaa.firebase em gmail.com> escreveu:
> Boas,
> vou dar-lhe algumas "idéias" para você analisar melhor.
> 1o.) IBO se comparado ao DBX deixa um pouco a desejar.( :S ) e por isso eu
> não o uso em meus sistemas, mas alguns que dou manutenção eu faço as
> mudanças sem ônus... então, é contigo...
> 2o.) você pode usar comandos "diretos" sem o uso de outros componentes que
> não sejam o compontente Database, exemplo utilizando o SqlConnection do DBX:
>
> sqlConn.ExecuteDirect('DELETE FROM NFE WHERE (ID =
> '+QuotedStr(edtCodigo.text)+' AND
> EMPRESA_ID='+QuotedStr(edtNumeroEmpresa.Text)+')');
>
> procure sempre utilizar a função QuotedStr, (e se acostume a usá-lo)...
> melhor do que usar ''' ''' (aspas duplas), pode-se passar despercebido caso
> não use corretamente.
>
> 3o.) vamos à explicação da mensagem de erro:
> Invalid Transaction handle (expecting explicit transaction start)",
>
> Invalid Transaction Handle -> "Transação" Invalida, porque?
>
> expecting explicit transaction start -> porque a transação não foi
> "startada", ou seja, você não "iniciou e finalizou" uma transação, exemplo
> em Delphi:
>
> var
>  TD : TTransactionDesc;
> begin
>
>    TD.TransactionID:=1;
>    td.IsolationLevel:=xilREADCOMMITTED;
>    sqlConn.StartTransaction(TD);
>    try
>        sqlConn.ExecuteDirect('comandos sql 1');
>       sqlConn.ExecuteDirect('comandos sql 2');
>       sqlConn.ExecuteDirect('comandos sql 3');
>
>       sqlconn.Commit(TD);
>    except
>       sqlconn.RollBack(TD);
>    end;
> end;
>
>
> 4o.) já o código que você apresentou, (335544569), o que eu encontrei foi
> uma explicação que não sei se te ajudará, mas tente ver ai.:
> http://www.firebirdfaq.org/faq261/
>
> Eu acho que tenho uma base em casa com a relação de códigos, se eu tiver,
> postarei aqui pra você (e demais).
>
> Qualquer coisa nos grite.
>
>
>
>
>
> Em 16 de janeiro de 2011 12:42, Salatiel da Rocha Venancio <
> salatielvenancio em ig.com.br> escreveu:
>
>> Bom dia pessoal.
>>
>> Estou criando algumas stored procedures para serem executadas a partir do
>> BD. E comecei a usar o comando execute statement, isso para "diminiuir" os
>> códigos. Mas percebi umas coisas estranhas. Uso Delphi 7, Firebird 2.5, IBO
>> 4.8.6.
>>
>> Veja o seguinte...
>>
>> Quando eu executo esse bloco de comandos por mais de uma vez,
>>
>> varSQL = 'DELETE FROM TABELA WHERE EMPRESA = :II_EMPRESA AND STATUS =
>> ''N''';
>> EXECUTE STATEMENT (varSQL) (II_EMPRESA := :I_EMPRESA);
>>
>> é retornado o seguinte erro: "Invalid Transaction handle (expecting
>> explicit
>> transaction start)", além desse erro, aparecem outros códigos de erro como
>> 335544569. Já procurei na net, tentei resolver mas nada.
>>
>> PORÉM, se eu usar o comando "in natura" é executado perfeitamente quantas
>> vezes forem necessárias, sem erro algum.
>>
>> DELETE FROM TABELA
>> WHERE EMPRESA = :I_EMPRESA AND STATUS = 'N';
>>
>> Por conhecer pouco FIREBIRD, talvez eu esteja esquecendo alguma coisa, ou
>> iniciar transacao, coisa e tal.
>>
>> Desde já agradeço.
>>
>> Obrigado.
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>> http://www.firebase.com.br/fb/artigo.php?id=1107
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use: http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>




Mais detalhes sobre a lista de discussão lista