Fórum Apenas 1 SQLConnection na aplicação Servidora, como faço? #281895

17/05/2005

0

Fala galera!!...seguinte: como faço para ter apenas 1 SQLConnection na minha aplicação servidora?...para depois na aplicação cliente ter apenas 1
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

Tchelllo

Responder

Posts

17/05/2005

Cristiam

Crie uma classe para fazer isso. ;)


Responder

Gostei + 0

17/05/2005

Tchelllo

Olá Cristiam....será que vc pode ser mais detalhado ?....a classe que vc diz seria criar outro Remote Data Module e colocar no uses o RDM principal que contem o SQLConnection?....pois se for, na aplicação cliente como faço para enxergar o RDM que contem as DataSets?

vlwww!!


Responder

Gostei + 0

17/05/2005

Kotho

dá uma olhada neste tópico [url]http://forum.clubedelphi.net/viewtopic.php?t=42509[/url]


Responder

Gostei + 0

17/05/2005

Tchelllo

Olá Kotho....analisei seu forum...mas não entendi algumas passagens...como por ex.

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


Responder

Gostei + 0

17/05/2005

Kotho

Vamos ver se consigo exclarecer todas as dúvidas, ok?
---

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


Responder

Gostei + 0

17/05/2005

Tchelllo

Então Kotho...veja o que estou fazendo de errado, pois não consegui ainda...

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 ?


Responder

Gostei + 0

17/05/2005

Kotho

Esse SQLConnection é uma property criada lá no TLB... no tópico que eu passei eu descrevi como está a estrutura do meu TLB... como está a sua???


Responder

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


Responder

Gostei + 0

17/05/2005

Kotho

Não...não... após abrir o TLB, clique em F12. Irá abrir uma tela gráfica com a estrutura do TLB... não mexa no código...


Responder

Gostei + 0

17/05/2005

Tchelllo

typelib Server
[ 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?


Responder

Gostei + 0

17/05/2005

Kotho

no lado esquerdo da tela gráfica tem um TreeView... essa é a estrutura... ela é formada de CoClass, Interfaces, Propertys (read e/ou write) e Mathods...


Responder

Gostei + 0

17/05/2005

Tchelllo

A estrutura está assim: (vou descrevê-la como se fosse o proprio TreeView pra vc ver)

-ServerSis
-IServer
Get_SQLConnetion (method)
+Server
-ItdmClientes --> Este é outro Transaction Data Module
... outros methods
+tdmClientes

espero ter sido claro.


Responder

Gostei + 0

17/05/2005

Kotho

Blz... agora começamos a falar a mesma lingua...

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


Responder

Gostei + 0

18/05/2005

Tchelllo

Está assim:

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.


Responder

Gostei + 0

18/05/2005

Kotho

Você implementou as procedure/functions?

no DataModule principal (Server):
--GetSQLConnection
--GetTdmCliente

e no secundário (tdmCliente):
--GetSQLConnection
--SetSQLConnection
--GetServer
--SetServer


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar