Fórum Apenas 1 SQLConnection na aplicação Servidora, como faço? #281895
17/05/2005
0
SocketConnection?...Explicando melhor, numa aplicação cliente/servidor, isto é facil, basta ter um datamodule central e adicionar nele um componente de conexão (como SQLConnection)...e depois os demais datamodules conterão as queryes ligadas ao dm central. Agora queria saber como faço para organizar os componentes nesse sentido para uma aplicação multicamadas. Fui aconselhado a ter em cada Remote Data Module que criar, ter um componente SQLConnection, mas e depois na aplicação cliente?....vai ficar ruim pois tb terei que ter um SocketConnection para cada SQLConnection....queria fazer algo que seguisse o mesmo modelo da aplicação cliente/servidor..ou seja, centralizar os componentes de conexão.
se alguém puder me ajudar!!....brigadão!!!
T++ pessoal
Marcelo
Tchelllo
Curtir tópico
+ 0Posts
17/05/2005
Cristiam
Gostei + 0
17/05/2005
Tchelllo
vlwww!!
Gostei + 0
17/05/2005
Kotho
Gostei + 0
17/05/2005
Tchelllo
function TRDM.Get_RDMRelatorio: IRDMRelatorio;
begin
Result := RDMRelatorioFactory.CreateCOMObject(nil) as IRDMRelatorio;
Result.RDM := Self;
Result.SQLConnection := Integer(SQLConnection1);
end;
O que esse RDMRelatorioFactory que vc colocou ?....não seria somente RDMRelatorio ?....não entendi essa parte.
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;
e nessas...o que seria FRDM ?...tb n]ao entendi.....e mais uma coisa...isso tb funciona qdo se usa Transaction Data Modules ?
vlww pela atenção meu caro!!!..obrigado!
Marcelo
Gostei + 0
17/05/2005
Kotho
---
Quando se cria um novo RemoteDataModule ou TransactionDataModule, ele utiliza este trecho no inicialization do DataModule...
initialization TComponentFactory.Create(ComServer, TRDM, Class_RDM, ciMultiInstance, tmApartment); end.
Por isso é preciso usar o mesmo método para instanciar os DataModules no DataModule principal...
Foi bom você ter tido essas dúvidas, porque tem que se mudar mais algumas coisas (eu tinha dito que era chatinho), e que eu tinha esquecido...
ele também define a variavel RDMRelatorio: TRDMRelatorio;
é preciso mudar para RDMRelatorioFactory: TComponentFactory;
e no inicialization
RDMRelatorioFactory := TComponentFactory.Create(ComServer, TRDMRelatorio, Class_RDMRelatorio, ciInternal, tmApartment);
Isso, eu creio, que sirva para que o DataModule não seja criado sozinho, mas que o DataModule Principal o crie...
---
As procedures Get´s e Set´s são, automaticamente, usadas pelo SharedConnection (que fica no Client), para fazer a instância dos DataModules.
---
Cada DataModule deve ter uma variável (privada) declarada... no meu caso eu fiz...
FRDM: IRDM
onde RDM é o meu DataModule principal. IRDM é a interface (no arquivo TLB)...
---
Bom... quando se usa essa forma, quando um client se conecta ao server, ele cria uma nova Thread, com a cópia do DataModule Principal e dos demais... com isso, a propriedade SQLConnection pode ser perdida... por isso tem que se usar os GetSQLConnection, para atribui-lo aos componentes... para fazer isso, é preciso serializar o componente, por isso o Integer(FRDM.SQLConnection).
---
Para ser bem simplista, no DataModule Principal são instanciados os DataModules secundários... e nos secundários, é referenciada (através de interface) o Principal, assim como o SQLConneciton.
Isto, porque, não se consegue referenciar um DataModule no outro de forma direta (declarando na uses)... é preciso passar a referencia do objeto de um para o outro.
E tudo isso, quem ajuda, é o SharedConnection no Client...
---
Eu sei que pode parecer confuso... mas eu vou tentar ajudar, da forma que eu puder...
Gostei + 0
17/05/2005
Tchelllo
nessa function...
function TRDM.Get_RDMRelatorio: IRDMRelatorio;
begin
Result := RDMRelatorioFactory.CreateCOMObject(nil) as IRDMRelatorio;
Result.RDM := Self;
Result.SQLConnection := Integer(SQLConnection1);
end;
como faço para obter esse valor....Result.RDM := Self; e
Result.SQLConnection := Integer(SQLConnection1); ????.....pois aqui só me aparece os métodos de IRDMRelatorio quando digito Result.
e nessa..
function TRDMRelatorio.Get_SQLConnection: Integer;
begin
Result := Integer(FRDM.SQLConnection);
end;
declarei na área private a variável como vc explicou...
FRDM : IRDM;
mas tb só me aparecem os métodos e não a propriedade SQLConnection....
O que estou fazendo de errado ?
Gostei + 0
17/05/2005
Kotho
Gostei + 0
17/05/2005
Tchelllo
// The Class CoServerVendas provides a Create and CreateRemote method to
// create instances of the default interface IServerVendas exposed by
// the CoClass ServerVendas. The functions are intended to be used by
// clients wishing to automate the CoClass objects exposed by the
// server of this typelibrary. ************************************************************//
CoServer = class
class function Create: IServer;
class function CreateRemote(const MachineName: string): IServer;
end;
aqui no meu _TLB não tem nada a ver com o que vc passou....peguei essa parte...mas não sei se é esta que vc ker...o restante abaixo dessas linhas estão as class functios etc...
Gostei + 0
17/05/2005
Kotho
Gostei + 0
17/05/2005
Tchelllo
[ uuid ´{E202BF71-1734-4220-87D4-C96ABF49DDA5}´,
version 1.0,
helpstring ´ServerSis Library´ ];
uses midas.dll, stdole2.tlb, stdvcl40.dll, stdvcl40.dll;
IServer = interface(IAppServer)
[ uuid ´{D3EF78A2-8A5B-4388-AE45-35F95A9FBFED}´,
version 1.0,
helpstring ´Dispatch interface for Server Object´,
dual,
oleautomation ]
function Get_SQLConn: Integer [dispid $0000012D]; safecall;
function Get_tdmCliente: ItdmClientes [dispid $0000012E]; safecall;
end;
Server = coclass(IServer [default] )
[ uuid ´{3834B633-6E50-40CA-983E-417D819B7CAF}´,
version 1.0,
helpstring ´Server Object´,
custom ´{17093CC8-9BD2-11CF-AA4F-304BF89C0001}´ 0 ];
peguei isso da aba Text da tela gráfica que se abriu....é isso?
Gostei + 0
17/05/2005
Kotho
Gostei + 0
17/05/2005
Tchelllo
-ServerSis
-IServer
Get_SQLConnetion (method)
+Server
-ItdmClientes --> Este é outro Transaction Data Module
... outros methods
+tdmClientes
espero ter sido claro.
Gostei + 0
17/05/2005
Kotho
no seu IServer, você tem que criar algumas propriedades...
SQLConnection - do tipo long - read
tdmClientes - do tipo ItdmClientes - read
no seu ItdmClientes...
SQLConnection - do tipo long - read/write
Server - do tipo IServer - read/write
--
Se você quizer facilitar o trabalho para não ter que criar as propriedades nos DataModules secundários, você pode criar uma interface base... eu chamei a minha de IBaseRDM... ai você cria as propriedades nessa interface... depois, na sua ItdmClientes, você muda a propriedade (do lado direito) Parent Interface para essa Interface Base, e não precisa criar as mesmas propriedades... Só precisará implementar as procedures/functions nos DataModules
--
detalhe... sempre que você alterar o TLB, e clicar no botão de refresh, as procedures/functions serão criadas nos DataModules, só faltando implementar...
---
aproveitando o post... como está a seção inicialization (fica no final da unit) dos seus DataModules???
Gostei + 0
18/05/2005
Tchelllo
initialization
TComponentFactory.Create(ComServer, TServer,
Class_Server, ciMultiInstance, tmApartment);
para o TDM Server, e...
initialization
tdmClientes := TComponentFactory.Create(ComServer, TtdmClientes,
Class_tdmClientes, ciMultiInstance, tmApartment);
para o outro...o TDMClientes
testei e deu certo agora....só que na aplicação cliente estou usando Socket...e quando coloco um SharedConnection a prop. ChildName fica em branco, não me retorna nada.....pq será que está acontecendo isso?....antes estava dando erro de Classe inválida....e agora isso...não aparece nada.
Gostei + 0
18/05/2005
Kotho
no DataModule principal (Server):
--GetSQLConnection
--GetTdmCliente
e no secundário (tdmCliente):
--GetSQLConnection
--SetSQLConnection
--GetServer
--SetServer
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)