Não existe evento BeforeExecProc em TSQLStoredProc?
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:
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:
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?
Coloquei a rotina para o SQLStoredProc em BeforeOpen/AfterOpen, mas não executa a rotina...
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
Curtidas 0
Respostas
Fernando
09/05/2013
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".
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".
GOSTEI 0