Fórum Serviço do Windows acessando banco de dados #344391
11/08/2007
0
estou criando um Serviço do Windows que precisa acessar um banco de dados em access. Sendo que observei que as Query´s que utilizei dentro do serviço não retorna nenhum resultado, mesmo com um simples SELECT.
Criei um aplicação remota com (TMtsDataModule) e instalei no COM+ até então tudo bem. Sendo que quando o serviço está em execução que tento abri o ClientDataSet no serviço ele me retorna o seguinte Erro: ´O aplicativo chamou uma interface empacotada para um outro segmento´
Será que não tenho como retornar resultado de uma consulta para o meu Serviço ?
Código abaixo para Thread criado:
procedure TThreadEstacao.Execute;
var
Log: TStringList;
begin
inherited;
while not (Terminated) do
begin
try
Service1.DCOMConnection1.Open;
Service1.ClientDataSet1.Close;
Service1.ClientDataSet1.Open; { O ERRO ACONTECE NESTE MOMENTO }
Service1.DCOMConnection1.Close;
except
on E: Exception do
begin
Log := TStringList.Create;
Log.Add(E.Message);
Log.SaveToFile(´c:\log_estacao.log´);
Log.Free;
end;
end;
Sleep(3000);
end;
Terminate;
end;
Marcelo.bastos
Curtir tópico
+ 0Posts
11/08/2007
Nerdex
Desta forma, fiz o seguinte, desenvlovi o projeto .exe sem form com todas as regras do meu negócio, e construí o serviço que se comunica com o tal .exe ... daí funcionou. É assim que os seviços ´vêem as coisas´, carregando Dlls ou Exes, e ´interfaceando-as´.
Esta é minha opinião.
Ricardo Bastos
POA / RS
Gostei + 0
12/08/2007
Adriano Santos
NexdEx, funcionar funciona direitinho, porém tem algumas coisas que temos que levar em consideração, uma dela e é que o serviço não pode atualizar nada da vcl, ou seja, componentes visuais, exibir mensagens e etc. Pra resolver este problema precisa sempre criar função fora da thread do serviço e chamá-la e dentro da thread, do contrário terá problemas. Estamos desenvolvendo um serviço na empresa e está funcionando direitinho, o unico problema que estamos tendo é que o serviço está consumindo muita memória e no servidor windows 2003 server ele não está sendo executado por conta de outras prioridades que tem no server. Ainda estams tentando resolver.
;)
Gostei + 0
12/08/2007
Marcelo.bastos
após os comentários de vocês. Estou tentando simplifica a chamada dentro do meu serviço, criando um método dentro do meu componente COM+. Sendo que fiz um teste dentro do serviço ele me retorna um seguinte erro ´Invalid variant operation´ após fazer a chamada DCOMConnection1.AppServer.Method1. Então fiz uma apliação cliente e
coloquei em um botão a mesma instrução e ele me retornou o a mesma mensagem. O mais interessante é que eu só peço para abrir minha conexão dentro do Method1.
procedure TDM.Method1 ;
begin
Conexao.Open();
Conexao.Close();
end;
Vocês tem idéia do que pode ser isso?
Valeu pessoal pela ajuda!
Gostei + 0
12/08/2007
Marcelo.bastos
depois de tudo funcionar em uma interface cliente convencional., voltou a dar a mesma mensagem ´O aplicativo chamou uma interface empacotada para um outro segmento´, quando eu tentava fazer as querys no primeiro post enviado.
Olha o código de teste que estou utilizando no Serviço:
-- método DCOMConnection1.AppServer.ConsultaTempoRestante(´home´)); está no component COM+
procedure TService1.Consulta();
begin
CoInitialize(nil);
ShowMessage(DCOMConnection1.AppServer.ConsultaTempoRestante(´home´));
CoUninitialize;
end;
{ Thread }
procedure TThreadEstacao.Execute;
var
Log: TStringList;
begin
inherited;
while not (Terminated) do
begin
try
Service1.Consulta();
except
on E: Exception do
begin
Log := TStringList.Create;
Log.Add(E.Message);
Log.SaveToFile(´c:\log_estacao.log´);
Log.Free;
end;
end;
Sleep(3000);
end;
Terminate;
end;
Gostei + 0
13/08/2007
Massuda
Gostei + 0
14/08/2007
Marcelo.bastos
retirei aquelas linhas mas, ainda aparece no meu log ´O aplicativo chamou uma interface empacotada para um outro segmento´.
Valeu!!!
Gostei + 0
07/11/2007
Comodelphi
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)