ProviderConnection e commandText
17/01/2010
0
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...
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...
Rad Informatica
Curtir tópico
+ 0
Responder
Posts
18/01/2010
Emerson Nascimento
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.
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
19/01/2010
Rad Informatica
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.
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
Clique aqui para fazer login e interagir na Comunidade :)