GARANTIR DESCONTO

Fórum Não existe evento BeforeExecProc em TSQLStoredProc? #442511

09/05/2013

0

olá amigos,

Uso Delphi 2010, firebird 2.5 e DBExpress. Estou atualizando meu sistema para que, antes de cada "open" de um select, seja aberto uma transação e logo em seguida finaliza a transação, algo do tipo:
  try
    transacao:=sqlConn.BeginTransaction(TDBXIsolations.ReadCommitted);
    simplesdataset1.open;
  finally
    sqlConn.CommitFreeAndNil(Transacao);
  end;


Isso porque percebemos que em alguns clientes, o processo do Firebird no gerenciador de tarefas do Windows ficava muito grande. E parece que a cada select feito pelo SimpleDataSet, ao fechar o dataset, o delphi não finalizava a transação, deixando em aberto.

A questão acima está resolvido pro SimpleDataSet, conforme abaixo:
  for i := 0 to Self.ComponentCount - 1 do
  begin
    if Self.Components[i] is TSimpleDataSet then
    begin
      (Self.Components[i] as TSimpleDataSet).Active:=false;
      (Self.Components[i] as TSimpleDataSet).Connection := dmConexao.sqlConn;
      (Self.Components[i] as TSimpleDataSet).BeforeOpen := dmConexao.IniciaTransacao;
      (Self.Components[i] as TSimpleDataSet).AfterOpen := dmConexao.FinalizaTransacao;
    end
    else if Self.Components[i] is TSQLQuery then
    begin
      (Self.Components[i] as TSQLQuery).Active:=false;
      (Self.Components[i] as TSQLQuery).SQLConnection := dmConexao.sqlConn;
      (Self.Components[i] as TSQLQuery).BeforeOpen := dmConexao.IniciaTransacao;
      (Self.Components[i] as TSQLQuery).AfterOpen := dmConexao.FinalizaTransacao;
    end
  end;


Mas para o SQLStoredProc, eu precisava dos eventos BeforeExecProc e AfterExecProc, os quais não existem. Porque no sistema existem vários lugares onde tem o SQLStoredProc, dando o comando ExecProc. E para não editar tela a tela, fazendo o código abaixo, gostaria de otimizar igual a rotina acima, onde faz um for no datamodule. Alguém tem alguma luz?
  try
    transacao:=sqlConn.BeginTransaction(TDBXIsolations.ReadCommitted);
    sqlstoredproc1.execproc;
  finally
    sqlConn.CommitFreeAndNil(Transacao);
  end;


Coloquei a rotina para o SQLStoredProc em BeforeOpen/AfterOpen, mas não executa a rotina...
procedure TdmConexao.FinalizaTransacao(DataSet: TDataSet);
begin
  sqlConn.CommitFreeAndNil(Transacao);
end;

procedure TdmConexao.IniciaTransacao(DataSet: TDataSet);
begin
  transacao:=sqlConn.BeginTransaction(TDBXIsolations.ReadCommitted);
end;
Fernando

Fernando

Responder

Posts

10/05/2013

Fernando

Mais um detalhe:

Ao executar a procedure pelo delphi, ou seja, com o comando "storedproc1.execproc", não é disparado o evento OnBeforeOpen, nem é executado o OnAfterOpen após o Execproc.... ambos eventos não são executados, esse é o problema. Eu precisava de um evento que fosse disparado antes e após o comando "storedproc1.execproc".
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar