Serviço do Windows acessando banco de dados

Delphi

11/08/2007

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;


Marcelo.bastos

Marcelo.bastos

Curtidas 0

Respostas

Nerdex

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


GOSTEI 0
Adriano Santos

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

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!


GOSTEI 0
Marcelo.bastos

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;


GOSTEI 0
Massuda

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

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!!!


GOSTEI 0
Comodelphi

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
POSTAR