Fórum Arquitetura Multi-Camadas #228544
28/04/2004
0
Estou desenvolvendo um sistema multi-tier, com um servidor COM (DLL) e tecnologia MIDAS.
Tenho vários Remote DataModules no servidor e não consegui compartilhar uma conexão entre eles. Quando o servidor é um .EXE isso é fácil pois eu consigo colocar um DataModule, com uma conexão ao banco, que é criado automaticamente ao iniciar a aplicação e os Remote Datamodules conseguem acessa-lo de forma compartilhada. Mas com DLL parece nao funcionar da mesma forma.
Assim, coloquei um componente de conexão em cada Remote DataModule.
Gostaria de saber se existe uma outra forma de fazer isto pois, neste caso, eu ficaria com muitas conexões abertas com o banco e não me parece ser a melhor soluação.
[],
Guilherme
Gmcouto
Curtir tópico
+ 0Posts
28/04/2005
Dessis Empresarial
Gostei + 0
28/04/2005
Rodolpho123
Gostei + 0
28/04/2005
Kotho
eu utilizo esta tecnologia, e posso dizer que não foi nada fácil conseguir ajuda...
eu vou tentar ajudar vocês através do fórum, até para que fique como fonte de pesquisa...
Talvez fique um pouco complicado de entender (pra mim foi um bocado)... mas eu vou tentar mesmo assim.
O grande segredo está na definição do _TLB...
no meu projeto está assim:
CoClass - RDM Interface - IRDM ReadOnly property - SQLConnection ReadOnly property - RDMRelatorio Interface - IBaseRDM ReadOnly property - SQLConnection WriteOnly property - SQLConnection ReadOnly property - RDM WriteOnly property - RDM CoClass - RDMRelatorio Interface IRDMRelatorio (herdando de IBaseRDM - Parent Interface)
Em meu RDM eu tenho os componentes de conexão com o banco.
no RDMRelatorio eu tenho os Querys de Relatórios...
no untRDM.pas eu tenho
function TRDM.Get_SQLConnection: Integer; begin // o Integer serve para serializar o componente Result := Integer(SQLConnection1); end; function TRDM.Get_RDMRelatorio: IRDMRelatorio; begin Result := RDMRelatorioFactory.CreateCOMObject(nil) as IRDMRelatorio; Result.RDM := Self; Result.SQLConnection := Integer(SQLConnection1); end;
no untRDMRelatorio.pas eu tenho
function TRDMRelatorio.Get_RDM: IRDM; begin Result := FRDM; end; procedure TRDMRelatorio.Set_RDM(const Value: IRDM); begin FRDM := Value; end; function TRDMRelatorio.Get_SQLConnection: Integer; begin Result := Integer(FRDM.SQLConnection); end; procedure TRDMRelatorio.Set_SQLConnection(Value: Integer); var x: integer; begin for x:=0 to ComponentCount -1 do if Components[x] is TCustomSQLDataSet then TSQLDataSet(Components[x]).SQLConnection := TSQLConnection(Value); end;
As propriedades SQLConnection são necessárias para que quando houver mais de um usuário utilizando uma conexão, não haja confusão de threads.
No lado Client é mais fácil... adicione um componente TSharedConnection da palheta DataSnap... na propriedade ParentConnection, coloque o nome da TDComConnection, e na ChildName deverá aparecer o RDMRelatorio... nos ClientDataSet´s, ao invéz de usar o TDComConnection, utilize o TSharedConneciton...
Como eu disse no início... parece complicado mesmo... :P mas funciona muito bem...
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)