ProviderConnection e commandText

17/01/2010

4

Olá galera.
estou migrando meu projeto 2 camadas para 3 camadas com o delphi2010 e datasnap
minhas duvidas são as seguintes:

1-
no clientdataset seto as popriedades:
RemoteServer
ProviderName

o RemoteServer é o componente ProviderConnection

posso usar apenas 1 componente desses no meu aplicativo client
e setar todos os clientDataset nele?
visto que la no meu servidor vou ter os DataSetProvider ligados nas querys especificas.
nele tbem seto a propriedade ProviderName ligando ao DataSetProvider la do Servidor..

ou para cada clientdataset tenho que botar um TDSProviderConnection?


2- Já vi em alguns caras em foruns, dizendo que nao se deve usar a propriedade CommandText do ClientDataSet, para que o aplicativo cliente fique totalmente independente do banco.

ta, mas se meu aplicativo vai rodar so em um banco mesmo e nao tenho pretensão de disponibiliza-los para outro.
isso vai trazer algum problema??
a unica coisa que consigo ver e que quando buscar dados do servidor
o pacote de dados a ser enviado vai ser maior, pois vou passar a instrucao sql la do client, ela chega servidor no TDataSetProvider que esse encaminha para o Component query que entao envia para o banco.

eu ja penso tbem que se eu escrever as querys nos clientes, o servidor de aplicativo vai ficar menor e economizar memoria..
acho que e insiginificante a quantidade de dados a mais que isso vai representar na hora de enviar a requisicao para o servidor...
tem ou nao problema nisso?


3-essa acho que e realmente complicada de algum ajudar, mas talvez alguem passou por isso.
comecei a conversao do projeto trocando as querys pelos clientdataset e por ai vai.
depois disso, meu sistema ao finalizar da access violation, ja botei break points em tudo qto foi local no projeto para ver onde ta dando o pau.
mas parece que e la nas units do datasnap.
funciona tudo legal o pau e so na hora de finalizar..
antes de iniciar a troca dos componentes, ja no DELPHI 2010 nao tava dando erro nenhum...
Responder

Posts

1- você pode ter apenas 1 componente de conexão associado a todos os clientdatasets.

2- não acredito nisso. se não fosse pra usar ela não estaria lá. o componente pode ficar independente do banco mesmo tendo instruções enviadas pelo clientdataset, desde que você tenha classes que gerem a instrução para o banco que o cliente esteja conectado. se seu aplicativo for homologado para um banco específico, não vejo problema em utilizar dessa forma. o trâmite interno na troca da instrução entre o provider e o componente de pesquisa é imperceptível. não precisa se preocupar com isso, mas é recomendável que você mantenha o máximo possível de queries e regras de negócio no servidor. isso facilita as atualizações, pois é preciso atualizar apenas o servidor e não todos os clientes. e a economia de memória a que você se refere é insignificante pois, somente por estar no servidor, a query não irá consumir nada. somente quando for executada e, mesmo assim, será fechada tão logo os dados sejam enviados para o cliente.

conheço alguns desenvolvedores que preferem ter um método - no servidor - que recebe a instrução SQL, a executa e devolve os dados para o cliente. tudo isso para não alterar diretamente a propriedade commandtext. sinceramente não vi nenhuma vantagem de performance em fazer dessa forma.

3- verifique se voê não tem algo nos métodos Destroy ou Close que possam estar causando esse problema.
Responder
Amigo Emerso, obrigado, o problema era por ter mesmo varios providers no aplicativo, bastava 1   tenho em varios pontos do meu aplicativo (2 camadas) rotinas que busca informacoes do banco e eu mostro isso em algum local ou uso em validacoes, ou seja preciso buscar isso e jogar em uma query   -estou tentando fazer uma rotina generica onde eu passdo o ID da consulta (integer), o filtro string, order by string   la no servidor eu pego esses parametros e para cada id eu faco um caso para pegar o sql, assim vou botando todo sql que preciso em um so local em uma so funcao   tudo blz   no cliente. tenho   ClientDataSet Ligado no Datasetprovider pelo providername   no DataSetProvider ligado no SqlServerMethod pelo DataSet   no SqlServerMethod  ligado no SQLConnection pelo sqlConection no SqlServerMethod no ServerMethodName  ligado a funcao qu existe la no servidor que retorna um TDataSet   no sqlConection conectado no meu servidor de aplicativo usando drive datasnap     no servidor de aplicativos tenho uma funcao que retorna um TDataSet e 3 parametros idconsulta:integer;filtro,ordem: string   tudo blz jogo isso tudo e no ambiente de desenho do delphi quando vou la no sqlservermetod preencho os parametros, qdo dou um active ele vai la e retona 'bunitinho'     so que qdo mando executar o aplicativo, passando os parametros manualmente da erro Index item out (-1) +- isso como se eu tivesse passando algo errado nos parametros da funcao   veja o que tem no botao.     procedure TForm1.Button1Click(Sender: TObject);
begin
ClientDataSet1.Close;
SqlServerMethod1.Params[0].AsInteger :=1;  //meu id da consulta ( la no servidor tenho um case para pegar o sql)
SqlServerMethod1.Params[1].AsInteger :='codcliente>1 and codcliente<100'; {meu filtro que jogo no where}
SqlServerMethod1.Params[2].AsInteger :='nomecliente'; {order by ....}
ClientDataSet1.Open; end;
sei que esse clientdataset e somente leitura nao vou conseguir usar ele para salvar, visto que o DataSetProvider ta no lado cliente, mas e isso mesmo que preciso.     seu eu pegar esses parametro e jogar manualmente no componente e da um active true no clientdataset vai que e blz (com o servidor rodando claro)   eu vi isso esse esquema ai num video do Andreano Lanusse mostrando, so que ele passava os parametros direto no delphi e abria por la, na hora de compilar ja tava conectado.. como era um video didatico ate entendo..   Obrigado a Todos.        
Responder