Serviço do Windows acessando banco de dados
Olá Pessoal,
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;
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
Curtidas 0
Respostas
Nerdex
11/08/2007
Acredito que ´serviço´ do win, tenha algumas limitações para que seja desenvolvido todo o código neste projeto, ou seja, uma vez fiz um serviço que utilizava várioas funções da API ... logo não retornava nenuhm resultado, e não funcionava nada.
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
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
Adriano Santos
11/08/2007
Acredito que ´serviço´ do win, tenha algumas limitações para que seja desenvolvido todo o código neste projeto, ou seja, uma vez fiz um serviço que utilizava várioas funções da API ... logo não retornava nenuhm resultado, e não funcionava nada.
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
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
Marcelo.bastos
11/08/2007
NerdeX / Adriano,
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!
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
Marcelo.bastos
11/08/2007
Pessoal,
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;
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
Massuda
11/08/2007
procedure TThreadEstacao.Execute;
var
Log: TStringList;
begin
inherited;
...
Tire esse inherited. TThread.Execute é um método abstrato, seu serviço irá dar um erro EAbstractError.procedure TThreadEstacao.Execute;
...
Terminate;
end;
Tire esse Terminate; Terminate não é para ser chamado de dentro da thread, mas sim ´de fora´. Terminate simplesmente faz Terminated = True.GOSTEI 0
Marcelo.bastos
11/08/2007
Massuda,
retirei aquelas linhas mas, ainda aparece no meu log ´O aplicativo chamou uma interface empacotada para um outro segmento´.
Valeu!!!
retirei aquelas linhas mas, ainda aparece no meu log ´O aplicativo chamou uma interface empacotada para um outro segmento´.
Valeu!!!
GOSTEI 0
Comodelphi
11/08/2007
Bom dia, gostaria saber se o colega que originou o tópico conseguiu solucionar o problema, pois estou com uma situação parecida: Eu tentei usar uma conexao cliente dentro de um serviço conectando a um RemoteDataModule. Sendo que não utilizo mais no Service e agora o Server só roda com o ThreadinModel = tmSingle, com tmApartment dá o erro: ´O aplicativo chamou uma interface empacotada para um outro segmento´.
GOSTEI 0